{
  "version": 3,
  "sources": ["../../src/utils/constant.ts", "../../src/errors.ts", "../../src/utils/browser-script.ts", "../../src/utils/fetch.ts", "../../src/stocks/shared/capabilities.ts", "../../src/stocks/shared/kline.ts", "../../src/utils/array.ts", "../../src/utils/iconv.ts", "../../src/stocks/shared/normalize.ts", "../../src/stocks/shared/provider.ts", "../../src/stocks/eastmoney/transforms/common-code.ts", "../../src/stocks/eastmoney/transforms/stock.ts", "../../src/stocks/eastmoney/index.ts", "../../src/stocks/sina/transforms/stock.ts", "../../src/stocks/shared/code-mapper.ts", "../../src/stocks/sina/transforms/common-code.ts", "../../src/stocks/sina/index.ts", "../../src/stocks/tencent/transforms/stock.ts", "../../src/stocks/tencent/transforms/common-code.ts", "../../src/stocks/tencent/index.ts", "../../src/stocks/auto/index.ts", "../../src/stocks/base/index.ts", "../../src/stocks/index.ts", "../../src/index.ts"],
  "sourcesContent": ["// \u9ED8\u8BA4\u80A1\u7968\u540D\u79F0\u5E38\u91CF\nexport const DEFAULT_NUMBER = 0;\nexport const DEFAULT_STRING = \"---\";\n\n// \u9ED8\u8BA4\u9519\u8BEF\u63D0\u793A\u5E38\u91CF\nexport const ERROR_API_CODE = \"\u8BF7\u68C0\u67E5\u80A1\u7968\u4EE3\u7801\u662F\u5426\u6B63\u786E\";\nexport const ERROR_COMMON_CODE = \"\u8BF7\u68C0\u67E5\u7EDF\u4E00\u4EE3\u7801\u662F\u5426\u6B63\u786E\";\n\nexport const ERROR_UNDEFINED_GET_STOCK = \"\u672A\u5B9E\u73B0\u83B7\u53D6\u80A1\u7968\u6570\u636E\";\nexport const ERROR_UNDEFINED_GET_STOCKS = \"\u672A\u5B9E\u73B0\u83B7\u53D6\u80A1\u7968\u6570\u636E\u7EC4\";\nexport const ERROR_UNDEFINED_GET_KLINES = \"\u672A\u5B9E\u73B0\u83B7\u53D6 K \u7EBF\u6570\u636E\";\nexport const ERROR_UNDEFINED_SEARCH_STOCK = \"\u672A\u5B9E\u73B0\u641C\u7D22\u80A1\u7968\u4EE3\u7801\";\n\nexport const ERROR_UNDEFINED_COMMON_CODE = \"\u672A\u5B9E\u73B0\u7EDF\u4E00\u4EE3\u7801\u8F6C\u6362\u80A1\u7968\u4EE3\u7801\";\nexport const ERROR_UNDEFINED_SZ_COMMON_CODE =\n  \"\u672A\u5B9E\u73B0\u6DF1\u4EA4\u6240\u7EDF\u4E00\u4EE3\u7801\u8F6C\u6362\u80A1\u7968\u4EE3\u7801\";\nexport const ERROR_UNDEFINED_SH_COMMON_CODE =\n  \"\u672A\u5B9E\u73B0\u4E0A\u4EA4\u6240\u7EDF\u4E00\u4EE3\u7801\u8F6C\u6362\u80A1\u7968\u4EE3\u7801\";\nexport const ERROR_UNDEFINED_HK_COMMON_CODE =\n  \"\u672A\u5B9E\u73B0\u6E2F\u4EA4\u6240\u7EDF\u4E00\u4EE3\u7801\u8F6C\u6362\u80A1\u7968\u4EE3\u7801\";\nexport const ERROR_UNDEFINED_US_COMMON_CODE =\n  \"\u672A\u5B9E\u73B0\u7F8E\u4EA4\u6240\u7EDF\u4E00\u4EE3\u7801\u8F6C\u6362\u80A1\u7968\u4EE3\u7801\";\n\nexport const ERROR_UNDEFINED_API_CODE = \"\u672A\u5B9E\u73B0\u80A1\u7968\u4EE3\u7801\u8F6C\u6362\u7EDF\u4E00\u4EE3\u7801\";\nexport const ERROR_UNDEFINED_API_CODES = \"\u672A\u5B9E\u73B0\u80A1\u7968\u4EE3\u7801\u7EC4\u8F6C\u6362\u7EDF\u4E00\u4EE3\u7801\u7EC4\";\nexport const ERROR_UNDEFINED_SZ_API_CODE = \"\u672A\u5B9E\u73B0\u6DF1\u4EA4\u6240\u80A1\u7968\u4EE3\u7801\u8F6C\u6362\u7EDF\u4E00\u4EE3\u7801\";\nexport const ERROR_UNDEFINED_SH_API_CODE = \"\u672A\u5B9E\u73B0\u4E0A\u4EA4\u6240\u80A1\u7968\u4EE3\u7801\u8F6C\u6362\u7EDF\u4E00\u4EE3\u7801\";\nexport const ERROR_UNDEFINED_HK_API_CODE = \"\u672A\u5B9E\u73B0\u6E2F\u4EA4\u6240\u80A1\u7968\u4EE3\u7801\u8F6C\u6362\u7EDF\u4E00\u4EE3\u7801\";\nexport const ERROR_UNDEFINED_US_API_CODE = \"\u672A\u5B9E\u73B0\u7F8E\u4EA4\u6240\u80A1\u7968\u4EE3\u7801\u8F6C\u6362\u7EDF\u4E00\u4EE3\u7801\";\n\nexport const ERROR_UNDEFINED_GET_CODE = \"\u672A\u5B9E\u73B0\u83B7\u53D6\u4EE3\u7801\";\nexport const ERROR_UNDEFINED_GET_NAME = \"\u672A\u5B9E\u73B0\u83B7\u53D6\u540D\u79F0\";\nexport const ERROR_UNDEFINED_GET_NOW = \"\u672A\u5B9E\u73B0\u83B7\u53D6\u73B0\u4EF7\";\nexport const ERROR_UNDEFINED_GET_LOW = \"\u672A\u5B9E\u73B0\u83B7\u53D6\u6700\u4F4E\u4EF7\";\nexport const ERROR_UNDEFINED_GET_HIGH = \"\u672A\u5B9E\u73B0\u83B7\u53D6\u6700\u9AD8\u4EF7\";\nexport const ERROR_UNDEFINED_GET_PERCENT = \"\u672A\u5B9E\u73B0\u83B7\u53D6\u6DA8\u8DCC\";\nexport const ERROR_UNDEFINED_GET_YESTERDAY = \"\u672A\u5B9E\u73B0\u83B7\u53D6\u6628\u65E5\u6536\u76D8\u4EF7\";\n\n// \u9ED8\u8BA4\u80A1\u7968\u6570\u636E\u5E38\u91CF\nexport const DEFAULT_STOCK = {\n  code: DEFAULT_STRING,\n  name: DEFAULT_STRING,\n  percent: DEFAULT_NUMBER,\n\n  now: DEFAULT_NUMBER,\n  low: DEFAULT_NUMBER,\n  high: DEFAULT_NUMBER,\n  yesterday: DEFAULT_NUMBER,\n};\n", "export class StockApiError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = new.target.name;\n  }\n}\n\nexport class StockRequestError extends StockApiError {}\n\nexport class StockCodeError extends StockApiError {}\n\nexport class StockParseError extends StockApiError {}\n", "import { StockRequestError } from \"../errors\";\n\ntype BrowserNode = {\n  appendChild(node: BrowserScriptElement): unknown;\n  removeChild?(node: BrowserScriptElement): unknown;\n};\n\ntype BrowserScriptElement = {\n  async: boolean;\n  charset: string;\n  onerror: (() => void) | null;\n  onload: (() => void) | null;\n  parentNode?: BrowserNode | null;\n  src: string;\n};\n\ntype BrowserDocument = {\n  body?: BrowserNode;\n  createElement(tagName: string): BrowserScriptElement;\n  documentElement?: BrowserNode;\n  head?: BrowserNode;\n};\n\ntype BrowserRuntime = typeof globalThis & {\n  document?: BrowserDocument;\n  [key: string]: unknown;\n};\n\nexport function isBrowserRuntime(): boolean {\n  return Boolean((globalThis as BrowserRuntime).document);\n}\n\nexport async function loadBrowserScript(options: {\n  charset?: string;\n  timeout?: number;\n  url: string;\n}): Promise<void> {\n  const runtime = globalThis as BrowserRuntime;\n  const document = runtime.document;\n  const parent = document?.head || document?.body || document?.documentElement;\n\n  if (!document || !parent) {\n    throw new StockRequestError(\"Browser document is not available\");\n  }\n\n  await new Promise<void>((resolve, reject) => {\n    const script = document.createElement(\"script\");\n    const timeout = options.timeout || 15000;\n    const timeoutId = setTimeout(() => {\n      cleanup();\n      reject(new StockRequestError(`Script request timed out after ${timeout}ms`));\n    }, timeout);\n\n    function cleanup(): void {\n      clearTimeout(timeoutId);\n      script.onload = null;\n      script.onerror = null;\n      script.parentNode?.removeChild?.(script);\n    }\n\n    script.async = true;\n    script.charset = options.charset || \"utf-8\";\n    script.onload = () => {\n      cleanup();\n      resolve();\n    };\n    script.onerror = () => {\n      cleanup();\n      reject(new StockRequestError(\"Script request failed\"));\n    };\n    script.src = options.url;\n\n    parent.appendChild(script);\n  });\n}\n\nexport async function loadBrowserScriptValue(options: {\n  charset?: string;\n  timeout?: number;\n  url: string;\n  variableName: string;\n}): Promise<string> {\n  const runtime = globalThis as BrowserRuntime;\n\n  await loadBrowserScript(options);\n\n  const value = runtime[options.variableName];\n  delete runtime[options.variableName];\n\n  return typeof value === \"string\" ? value : \"\";\n}\n\nexport async function loadBrowserJsonp<T>(options: {\n  callbackParam?: string;\n  charset?: string;\n  timeout?: number;\n  url: string;\n}): Promise<T> {\n  const runtime = globalThis as BrowserRuntime;\n  const callbackParam = options.callbackParam || \"callback\";\n  const callbackName = `stockApiJsonp${Date.now()}${Math.floor(\n    Math.random() * 100000\n  )}`;\n  let result: T | undefined;\n\n  runtime[callbackName] = (value: T) => {\n    result = value;\n  };\n\n  try {\n    const url = appendQueryParam(options.url, callbackParam, callbackName);\n\n    await loadBrowserScript({\n      charset: options.charset,\n      timeout: options.timeout,\n      url,\n    });\n  } finally {\n    delete runtime[callbackName];\n  }\n\n  if (result === undefined) {\n    throw new StockRequestError(\"JSONP response did not invoke callback\");\n  }\n\n  return result;\n}\n\nfunction appendQueryParam(url: string, name: string, value: string): string {\n  const separator = url.includes(\"?\") ? \"&\" : \"?\";\n  return `${url}${separator}${encodeURIComponent(name)}=${encodeURIComponent(\n    value\n  )}`;\n}\n", "import { StockRequestError } from \"../errors\";\n\ntype HeaderValue = string | string[] | undefined;\n\nexport interface Response {\n  body: ArrayBuffer;\n  headers: Record<string, HeaderValue>;\n  status: number;\n  text: string;\n}\n\ntype RequestOptions = {\n  headers: Record<string, string>;\n  retries: number;\n  timeout: number;\n};\n\nclass RequestBuilder implements PromiseLike<Response> {\n  private options: RequestOptions = {\n    headers: {\n      Accept: \"*/*\",\n      \"User-Agent\": \"Mozilla/5.0 (compatible; stock-api/2.0)\",\n    },\n    retries: 2,\n    timeout: 15000,\n  };\n\n  constructor(private readonly url: string) {}\n\n  set(name: string, value: string): this {\n    this.options.headers[name] = value;\n    return this;\n  }\n\n  responseType(_type: string): this {\n    return this;\n  }\n\n  retries(count: number): this {\n    this.options.retries = count;\n    return this;\n  }\n\n  timeout(ms: number): this {\n    this.options.timeout = ms;\n    return this;\n  }\n\n  then<TResult1 = Response, TResult2 = never>(\n    onfulfilled?:\n      | ((value: Response) => TResult1 | PromiseLike<TResult1>)\n      | undefined\n      | null,\n    onrejected?:\n      | ((reason: unknown) => TResult2 | PromiseLike<TResult2>)\n      | undefined\n      | null\n  ): PromiseLike<TResult1 | TResult2> {\n    return this.send().then(onfulfilled, onrejected);\n  }\n\n  private async send(): Promise<Response> {\n    let lastError: unknown;\n\n    for (let attempt = 0; attempt <= this.options.retries; attempt++) {\n      try {\n        return await request(this.url, this.options);\n      } catch (error) {\n        lastError = error;\n      }\n    }\n\n    throw lastError;\n  }\n}\n\nasync function request(url: string, options: RequestOptions): Promise<Response> {\n  if (typeof globalThis.fetch !== \"function\") {\n    throw new StockRequestError(\"globalThis.fetch is not available\");\n  }\n\n  const controller = new AbortController();\n  const timeoutId = setTimeout(() => controller.abort(), options.timeout);\n\n  try {\n    const response = await globalThis.fetch(url, {\n      headers: createRequestHeaders(options.headers),\n      redirect: \"follow\",\n      signal: controller.signal,\n    });\n\n    const status = response.status;\n    const body = await response.arrayBuffer();\n    const result = {\n      body,\n      headers: getResponseHeaders(response.headers),\n      status,\n      text: new TextDecoder(\"utf-8\").decode(body),\n    };\n\n    if (!response.ok) {\n      throw new StockRequestError(`Request failed with status ${status}`);\n    }\n\n    return result;\n  } catch (error) {\n    if (isAbortError(error)) {\n      throw new StockRequestError(`Request timed out after ${options.timeout}ms`);\n    }\n\n    throw error;\n  } finally {\n    clearTimeout(timeoutId);\n  }\n}\n\nfunction createRequestHeaders(headers: Record<string, string>): Headers {\n  const result = new Headers();\n\n  for (const [name, value] of Object.entries(headers)) {\n    if (isBrowserForbiddenHeader(name)) {\n      continue;\n    }\n\n    result.set(name, value);\n  }\n\n  return result;\n}\n\nfunction getResponseHeaders(headers: Headers): Record<string, HeaderValue> {\n  const result: Record<string, HeaderValue> = {};\n\n  headers.forEach((value, name) => {\n    result[name] = value;\n  });\n\n  return result;\n}\n\nfunction isBrowserForbiddenHeader(name: string): boolean {\n  if (!isBrowser()) {\n    return false;\n  }\n\n  return [\"referer\", \"user-agent\"].includes(name.toLowerCase());\n}\n\nfunction isBrowser(): boolean {\n  return \"window\" in globalThis && \"document\" in globalThis;\n}\n\nfunction isAbortError(error: unknown): boolean {\n  return error instanceof DOMException && error.name === \"AbortError\";\n}\n\nconst requestClient = {\n  get(url: string) {\n    return new RequestBuilder(url);\n  },\n};\n\nexport default requestClient;\n", "import { StockRequestError } from \"../../errors\";\nimport { isBrowserRuntime } from \"../../utils/browser-script\";\nimport { StockSource } from \"../../types/utils/stock\";\n\nexport type StockProviderFeature = \"kline\" | \"quote\" | \"search\";\nexport type StockProviderRuntime = \"browser\" | \"node\";\nexport type StockProviderSupport = {\n  supported: boolean;\n  note?: string;\n};\n\nexport type StockProviderCapability = {\n  browser: Record<StockProviderFeature, StockProviderSupport>;\n  node: Record<StockProviderFeature, StockProviderSupport>;\n  source: Exclude<StockSource, \"base\">;\n};\n\nconst supported: StockProviderSupport = { supported: true };\nconst sinaBrowserUnsupported: StockProviderSupport = {\n  supported: false,\n  note:\n    \"Sina requires a valid Referer that browser JavaScript cannot set. Use stocks.auto, Node.js, or a backend proxy.\",\n};\n\nconst capabilities: Record<\n  Exclude<StockSource, \"base\">,\n  StockProviderCapability\n> = {\n  eastmoney: {\n    browser: {\n      kline: supported,\n      quote: supported,\n      search: supported,\n    },\n    node: {\n      kline: supported,\n      quote: supported,\n      search: supported,\n    },\n    source: \"eastmoney\",\n  },\n  sina: {\n    browser: {\n      kline: supported,\n      quote: sinaBrowserUnsupported,\n      search: sinaBrowserUnsupported,\n    },\n    node: {\n      kline: supported,\n      quote: supported,\n      search: supported,\n    },\n    source: \"sina\",\n  },\n  tencent: {\n    browser: {\n      kline: supported,\n      quote: supported,\n      search: supported,\n    },\n    node: {\n      kline: supported,\n      quote: supported,\n      search: supported,\n    },\n    source: \"tencent\",\n  },\n};\n\nexport function getProviderCapabilities(): StockProviderCapability[] {\n  return Object.values(capabilities).map((capability) => ({\n    browser: cloneRuntimeCapability(capability.browser),\n    node: cloneRuntimeCapability(capability.node),\n    source: capability.source,\n  }));\n}\n\nexport function assertProviderFeatureSupported(\n  source: Exclude<StockSource, \"base\">,\n  feature: StockProviderFeature\n): void {\n  const runtime: StockProviderRuntime = isBrowserRuntime() ? \"browser\" : \"node\";\n  const support = capabilities[source][runtime][feature];\n\n  if (!support.supported) {\n    throw new StockRequestError(\n      `${source} ${feature} is not available in ${runtime}. ${support.note || \"\"}`.trim()\n    );\n  }\n}\n\nfunction cloneRuntimeCapability(\n  capability: Record<StockProviderFeature, StockProviderSupport>\n): Record<StockProviderFeature, StockProviderSupport> {\n  return {\n    kline: { ...capability.kline },\n    quote: { ...capability.quote },\n    search: { ...capability.search },\n  };\n}\n", "import Kline, {\n  KlineAdjust,\n  KlineOptions,\n  KlinePeriod,\n} from \"../../types/utils/kline\";\nimport { StockSource } from \"../../types/utils/stock\";\n\nconst defaultOptions: Required<KlineOptions> = {\n  adjust: \"none\",\n  count: 120,\n  period: \"day\",\n};\n\nexport function normalizeKlineOptions(options: KlineOptions = {}): Required<KlineOptions> {\n  return {\n    adjust: normalizeAdjust(options.adjust),\n    count: normalizeCount(options.count),\n    period: normalizePeriod(options.period),\n  };\n}\n\nexport function parseKlineNumber(value: unknown): number {\n  const number = Number(value);\n  return Number.isFinite(number) ? number : 0;\n}\n\nexport function createKline(row: {\n  close: unknown;\n  date: string;\n  high: unknown;\n  low: unknown;\n  open: unknown;\n  source: Exclude<StockSource, \"base\">;\n  volume?: unknown;\n}): Kline {\n  const kline: Kline = {\n    close: parseKlineNumber(row.close),\n    date: row.date,\n    high: parseKlineNumber(row.high),\n    low: parseKlineNumber(row.low),\n    open: parseKlineNumber(row.open),\n    source: row.source,\n  };\n\n  if (row.volume !== undefined) {\n    kline.volume = parseKlineNumber(row.volume);\n  }\n\n  return kline;\n}\n\nexport function isAvailableKlines(klines: Kline[]): boolean {\n  return klines.length > 0;\n}\n\nfunction normalizePeriod(period: KlinePeriod | undefined): KlinePeriod {\n  return period || defaultOptions.period;\n}\n\nfunction normalizeAdjust(adjust: KlineAdjust | undefined): KlineAdjust {\n  return adjust || defaultOptions.adjust;\n}\n\nfunction normalizeCount(count: number | undefined): number {\n  if (count === undefined) {\n    return defaultOptions.count;\n  }\n\n  if (!Number.isFinite(count) || count <= 0) {\n    return defaultOptions.count;\n  }\n\n  return Math.floor(count);\n}\n", "export function uniq<T>(items: T[]): T[] {\n  return Array.from(new Set(items));\n}\n", "function normalizeEncoding(encoding: string): string {\n  return encoding.toLowerCase() === \"gbk\" ? \"gb18030\" : encoding;\n}\n\nconst iconv = {\n  decode(body: ArrayBuffer, encoding: string): string {\n    return new TextDecoder(normalizeEncoding(encoding)).decode(body);\n  },\n};\n\nexport default iconv;\n", "import Stock, { StockSource } from \"../../types/utils/stock\";\n\nexport function normalizeStock(\n  stock: Stock,\n  source: StockSource\n): Stock {\n  return {\n    ...stock,\n    source,\n  };\n}\n", "import { uniq } from \"../../utils/array\";\nimport { isBrowserRuntime } from \"../../utils/browser-script\";\nimport fetch from \"../../utils/fetch\";\nimport iconv from \"../../utils/iconv\";\nimport { DEFAULT_STOCK } from \"../../utils/constant\";\nimport StockApi from \"../../types/stocks\";\nimport Kline, { KlineOptions } from \"../../types/utils/kline\";\nimport Stock, { StockSource } from \"../../types/utils/stock\";\nimport { assertProviderFeatureSupported } from \"./capabilities\";\nimport { normalizeStock } from \"./normalize\";\n\ntype CodeTransform = {\n  transform(code: string): string;\n  transforms(codes: string[]): string[];\n};\n\ntype Header = readonly [name: string, value: string];\n\ntype QuoteConfig = {\n  browserRequestText?: (apiCodes: string[]) => Promise<string>;\n  codeTransform: CodeTransform;\n  delimiter: string;\n  encoding: string;\n  headers?: readonly Header[];\n  getUrl(apiCodes: string[]): string;\n  isMissing(row: string, apiCode: string): boolean;\n  parseStock(code: string, params: string[]): Stock;\n};\n\ntype SearchConfig = {\n  browserRequestText?: (key: string) => Promise<string>;\n  encoding: string;\n  headers?: readonly Header[];\n  getUrl(key: string): string;\n  parseCodes(body: string): string[];\n};\n\ntype KlineConfig = {\n  getKlines(code: string, options?: KlineOptions): Promise<Kline[]>;\n};\n\nexport type StockProviderConfig = {\n  kline: KlineConfig;\n  source: Exclude<StockSource, \"base\">;\n  quote: QuoteConfig;\n  search: SearchConfig;\n};\n\nexport type StockInspectionStatus = \"empty\" | \"error\" | \"success\";\n\nexport type StockProviderInspection = {\n  code: string;\n  source: Exclude<StockSource, \"base\">;\n  status: StockInspectionStatus;\n  stock?: Stock;\n  error?: string;\n};\n\nexport interface StockProviderApi extends StockApi {\n  inspectStock(code: string): Promise<StockProviderInspection>;\n}\n\nexport function normalizeCodes(codes: string[]): string[] {\n  return uniq(codes.filter((code) => code !== \"\"));\n}\n\nexport function createMissingStock(code: string): Stock {\n  return { ...DEFAULT_STOCK, code };\n}\n\nexport function splitRows(body: string): string[] {\n  return body.split(\";\\n\").filter((row) => row !== \"\");\n}\n\nexport function getAssignedValue(row: string): string {\n  const [, value = \"\"] = row.split(\"=\");\n  return value;\n}\n\nexport function getDelimitedParams(row: string, delimiter: string): string[] {\n  return getAssignedValue(row).replace('\"', \"\").split(delimiter);\n}\n\nexport function createStockProvider(config: StockProviderConfig): StockProviderApi {\n  async function getStocks(codes: string[]): Promise<Stock[]> {\n    const normalizedCodes = normalizeCodes(codes);\n\n    if (normalizedCodes.length === 0) {\n      return [];\n    }\n\n    assertProviderFeatureSupported(config.source, \"quote\");\n\n    const apiCodes = config.quote.codeTransform.transforms(normalizedCodes);\n    const body = await requestQuoteText(config.quote, apiCodes);\n    const rows = splitRows(body);\n\n    return normalizedCodes.map((code, index) => {\n      const apiCode = apiCodes[index];\n      const row = rows.find((item) => item.includes(apiCode)) || \"\";\n\n      if (config.quote.isMissing(row, apiCode)) {\n        return createMissingStock(code);\n      }\n\n      const params = getDelimitedParams(row, config.quote.delimiter);\n      return config.quote.parseStock(code, params);\n    });\n  }\n\n  async function requestQuoteText(\n    quote: QuoteConfig,\n    apiCodes: string[]\n  ): Promise<string> {\n    if (isBrowserRuntime() && quote.browserRequestText) {\n      return quote.browserRequestText(apiCodes);\n    }\n\n    return requestText({\n      encoding: quote.encoding,\n      headers: quote.headers,\n      url: quote.getUrl(apiCodes),\n    });\n  }\n\n  const api: StockProviderApi = {\n    async getStock(code: string): Promise<Stock> {\n      const [stock] = await getStocks([code]);\n      return stock || createMissingStock(code);\n    },\n\n    getStocks,\n\n    getKlines(code: string, options?: KlineOptions): Promise<Kline[]> {\n      return config.kline.getKlines(code, options);\n    },\n\n    async searchStocks(key: string): Promise<Stock[]> {\n      assertProviderFeatureSupported(config.source, \"search\");\n\n      const body = await requestSearchText(config.search, key);\n      return getStocks(config.search.parseCodes(body));\n    },\n\n    async inspectStock(code: string): Promise<StockProviderInspection> {\n      return createStockInspection(config.source, code, api.getStock);\n    },\n  };\n\n  return api;\n}\n\nasync function requestSearchText(\n  search: SearchConfig,\n  key: string\n): Promise<string> {\n  if (isBrowserRuntime() && search.browserRequestText) {\n    return search.browserRequestText(key);\n  }\n\n  return requestText({\n    encoding: search.encoding,\n    headers: search.headers,\n    url: search.getUrl(key),\n  });\n}\n\nexport async function createStockInspection(\n  source: Exclude<StockSource, \"base\">,\n  code: string,\n  getStock: (code: string) => Promise<Stock>\n): Promise<StockProviderInspection> {\n  try {\n    const stock = normalizeStock(await getStock(code), source);\n\n    return {\n      code,\n      source,\n      status: isAvailableStock(stock) ? \"success\" : \"empty\",\n      stock,\n    };\n  } catch (error) {\n    return {\n      code,\n      source,\n      status: \"error\",\n      error: getErrorMessage(error),\n    };\n  }\n}\n\nfunction isAvailableStock(stock: Stock | undefined): stock is Stock {\n  return Boolean(stock && stock.name !== DEFAULT_STOCK.name);\n}\n\nfunction getErrorMessage(error: unknown): string {\n  return error instanceof Error ? error.message : String(error);\n}\n\nasync function requestText(options: {\n  encoding: string;\n  headers?: readonly Header[];\n  url: string;\n}): Promise<string> {\n  const req = fetch.get(options.url).responseType(\"blob\");\n\n  for (const [name, value] of options.headers || []) {\n    req.set(name, value);\n  }\n\n  const res = await req;\n  return iconv.decode(res.body, options.encoding);\n}\n", "import {\n  COMMON_SH,\n  COMMON_SZ,\n} from \"../../base/utils/constant\";\nimport { StockCodeError } from \"../../../errors\";\nimport { ERROR_COMMON_CODE } from \"../../../utils/constant\";\n\nexport function transformEastmoneyCommonCode(code: string): string {\n  const normalizedCode = String(code).toUpperCase();\n\n  if (normalizedCode.startsWith(COMMON_SH)) {\n    return `1.${normalizedCode.slice(COMMON_SH.length)}`;\n  }\n\n  if (normalizedCode.startsWith(COMMON_SZ)) {\n    return `0.${normalizedCode.slice(COMMON_SZ.length)}`;\n  }\n\n  throw new StockCodeError(ERROR_COMMON_CODE);\n}\n\nconst EastmoneyCommonCodeTransform = {\n  transform: transformEastmoneyCommonCode,\n  transforms(codes: string[]): string[] {\n    return codes.map(transformEastmoneyCommonCode);\n  },\n};\n\nexport default EastmoneyCommonCodeTransform;\n", "import Stock from \"../../../types/utils/stock\";\nimport { DEFAULT_NUMBER, DEFAULT_STRING } from \"../../../utils/constant\";\n\nexport type EastmoneyQuote = {\n  f2?: number | string;\n  f3?: number | string;\n  f12?: string;\n  f14?: string;\n  f15?: number | string;\n  f16?: number | string;\n  f18?: number | string;\n  f43?: number | string;\n  f44?: number | string;\n  f45?: number | string;\n  f57?: string;\n  f58?: string;\n  f60?: number | string;\n  f170?: number | string;\n};\n\nexport function parseEastmoneyStock(code: string, quote?: EastmoneyQuote): Stock {\n  const now = getEastmoneyStockNow(quote);\n  const yesterday = getEastmoneyStockYesterday(quote);\n  const percentValue = numberValue(quote?.f170 ?? quote?.f3);\n\n  return {\n    code: getEastmoneyStockCode(code),\n    name: getEastmoneyStockName(quote),\n    percent: percentValue ? percentValue / 100 : now && yesterday ? now / yesterday - 1 : DEFAULT_NUMBER,\n    now,\n    low: getEastmoneyStockLow(quote),\n    high: getEastmoneyStockHigh(quote),\n    yesterday,\n  };\n}\n\nexport function getEastmoneyStockCode(code: string): string {\n  return String(code).toUpperCase();\n}\n\nexport function getEastmoneyStockName(quote?: EastmoneyQuote): string {\n  return String(quote?.f58 || quote?.f14 || DEFAULT_STRING);\n}\n\nexport function getEastmoneyStockNow(quote?: EastmoneyQuote): number {\n  return numberValue(quote?.f43 ?? quote?.f2);\n}\n\nexport function getEastmoneyStockLow(quote?: EastmoneyQuote): number {\n  return numberValue(quote?.f45 ?? quote?.f16);\n}\n\nexport function getEastmoneyStockHigh(quote?: EastmoneyQuote): number {\n  return numberValue(quote?.f44 ?? quote?.f15);\n}\n\nexport function getEastmoneyStockYesterday(quote?: EastmoneyQuote): number {\n  return numberValue(quote?.f60 ?? quote?.f18);\n}\n\nexport function getEastmoneyStockPercent(quote?: EastmoneyQuote): number {\n  const percentValue = numberValue(quote?.f170 ?? quote?.f3);\n  if (percentValue) return percentValue / 100;\n\n  const now = getEastmoneyStockNow(quote);\n  const yesterday = getEastmoneyStockYesterday(quote);\n  return now && yesterday ? now / yesterday - 1 : DEFAULT_NUMBER;\n}\n\nconst EastmoneyStockTransform = {\n  parse: parseEastmoneyStock,\n  getCode: getEastmoneyStockCode,\n  getName: getEastmoneyStockName,\n  getNow: getEastmoneyStockNow,\n  getLow: getEastmoneyStockLow,\n  getHigh: getEastmoneyStockHigh,\n  getYesterday: getEastmoneyStockYesterday,\n  getPercent: getEastmoneyStockPercent,\n  getStock: parseEastmoneyStock,\n};\n\nfunction numberValue(value: number | string | undefined): number {\n  if (value === undefined || value === null || value === \"-\") return DEFAULT_NUMBER;\n\n  const next = Number(value);\n  return Number.isFinite(next) ? next : DEFAULT_NUMBER;\n}\n\nexport default EastmoneyStockTransform;\n", "import Stock from \"../../types/utils/stock\";\nimport Kline, { KlineOptions } from \"../../types/utils/kline\";\nimport { isBrowserRuntime, loadBrowserJsonp } from \"../../utils/browser-script\";\nimport { DEFAULT_STOCK } from \"../../utils/constant\";\nimport fetch from \"../../utils/fetch\";\nimport { assertProviderFeatureSupported } from \"../shared/capabilities\";\nimport {\n  createKline,\n  normalizeKlineOptions,\n} from \"../shared/kline\";\nimport {\n  createStockInspection,\n  normalizeCodes,\n  StockProviderApi,\n} from \"../shared/provider\";\nimport EastmoneyCommonCodeTransform from \"./transforms/common-code\";\nimport {\n  EastmoneyQuote,\n  parseEastmoneyStock,\n} from \"./transforms/stock\";\n\ntype EastmoneyQuoteResponse = {\n  data?: EastmoneyQuote | null;\n};\n\ntype EastmoneySuggestItem = {\n  Code?: string;\n  Name?: string;\n  MktNum?: string;\n  QuoteID?: string;\n};\n\ntype EastmoneySuggestResponse = {\n  QuotationCodeTable?: {\n    Data?: EastmoneySuggestItem[];\n  };\n};\n\ntype EastmoneyKlineResponse = {\n  data?: {\n    klines?: string[];\n  } | null;\n};\n\nconst quoteFields = \"f43,f44,f45,f57,f58,f60,f170\";\nconst klineFields = \"f51,f52,f53,f54,f55,f56\";\nconst suggestToken = \"D43BF722C8E33BDC906FB84D85E326E8\";\nconst requestTimeoutMs = 4000;\nconst defaultPush2Host = \"push2delay.eastmoney.com\";\nconst defaultPush2HisHost = \"push2his.eastmoney.com\";\nconst push2HisHosts = [\n  defaultPush2HisHost,\n  \"7.push2his.eastmoney.com\",\n  \"33.push2his.eastmoney.com\",\n  \"63.push2his.eastmoney.com\",\n  \"91.push2his.eastmoney.com\",\n];\n\nfunction getSuggestUrl(key: string): string {\n  return `https://searchapi.eastmoney.com/api/suggest/get?input=${encodeURIComponent(\n    key\n  )}&type=14&token=${suggestToken}`;\n}\n\nasync function getStocks(codes: string[]): Promise<Stock[]> {\n  const normalizedCodes = normalizeCodes(codes);\n\n  if (normalizedCodes.length === 0) {\n    return [];\n  }\n\n  assertProviderFeatureSupported(\"eastmoney\", \"quote\");\n\n  return Promise.all(normalizedCodes.map(fetchOneStock));\n}\n\nconst Eastmoney: StockProviderApi = {\n  async getStock(code: string): Promise<Stock> {\n    const [stock] = await getStocks([code]);\n    return stock || createMissingStock(code);\n  },\n\n  getStocks,\n\n  async getKlines(code: string, options?: KlineOptions): Promise<Kline[]> {\n    return getKlines(code, options);\n  },\n\n  async searchStocks(key: string): Promise<Stock[]> {\n    assertProviderFeatureSupported(\"eastmoney\", \"search\");\n\n    const response = await requestSuggestJson(key);\n    const codes = (response.QuotationCodeTable?.Data || [])\n      .map(parseSuggestCode)\n      .filter(Boolean) as string[];\n\n    return getStocks(codes);\n  },\n\n  async inspectStock(code: string) {\n    return createStockInspection(\"eastmoney\", code, Eastmoney.getStock);\n  },\n};\n\nasync function getKlines(code: string, options?: KlineOptions): Promise<Kline[]> {\n  assertProviderFeatureSupported(\"eastmoney\", \"kline\");\n\n  const normalizedOptions = normalizeKlineOptions(options);\n  const apiCode = EastmoneyCommonCodeTransform.transform(code);\n  const url = `https://${defaultPush2HisHost}/api/qt/stock/kline/get?fields1=f1,f2,f3,f4,f5,f6&fields2=${klineFields}&ut=7eea3edcaed734bea9cbfc24409ed989&klt=${getKlinePeriodCode(\n    normalizedOptions.period\n  )}&fqt=${getAdjustCode(normalizedOptions.adjust)}&secid=${encodeURIComponent(\n    apiCode\n  )}&beg=19700101&end=20500101&lmt=${normalizedOptions.count}`;\n  const response = await requestJsonFromHosts<EastmoneyKlineResponse>(\n    url,\n    push2HisHosts\n  );\n  const rows = response.data?.klines || [];\n\n  return rows.map((line) => {\n    const [date, open, close, high, low, volume] = line.split(\",\");\n    return createKline({\n      close,\n      date,\n      high,\n      low,\n      open,\n      source: \"eastmoney\",\n      volume,\n    });\n  });\n}\n\nasync function fetchOneStock(code: string): Promise<Stock> {\n  const apiCode = EastmoneyCommonCodeTransform.transform(code);\n  const url = `https://${defaultPush2Host}/api/qt/stock/get?fltt=2&invt=2&secid=${encodeURIComponent(\n    apiCode\n  )}&fields=${quoteFields}`;\n  const quote = await requestQuote(url);\n\n  if (!quote?.f57 && !quote?.f58) {\n    return createMissingStock(code);\n  }\n\n  return parseEastmoneyStock(code, quote);\n}\n\nasync function requestQuote(url: string): Promise<EastmoneyQuote | undefined> {\n  const response = await requestJson<EastmoneyQuoteResponse>(url, 1);\n  const quote = response.data;\n\n  if (quote?.f57 || quote?.f58) {\n    return quote;\n  }\n\n  return undefined;\n}\n\nasync function requestJson<T>(url: string, retries = 0): Promise<T> {\n  let lastError: unknown;\n\n  for (let attempt = 0; attempt <= retries; attempt++) {\n    try {\n      const response = await fetch\n        .get(url)\n        .set(\"Accept\", \"application/json,text/plain,*/*\")\n        .set(\"Referer\", \"https://quote.eastmoney.com/\")\n        .retries(0)\n        .timeout(requestTimeoutMs);\n\n      return JSON.parse(response.text) as T;\n    } catch (error) {\n      lastError = error;\n    }\n  }\n\n  throw lastError;\n}\n\nfunction getKlinePeriodCode(period: KlineOptions[\"period\"]): string {\n  switch (period) {\n    case \"week\":\n      return \"102\";\n    case \"month\":\n      return \"103\";\n    case \"day\":\n    default:\n      return \"101\";\n  }\n}\n\nfunction getAdjustCode(adjust: KlineOptions[\"adjust\"]): string {\n  switch (adjust) {\n    case \"qfq\":\n      return \"1\";\n    case \"hfq\":\n      return \"2\";\n    case \"none\":\n    default:\n      return \"0\";\n  }\n}\n\nasync function requestSuggestJson(key: string): Promise<EastmoneySuggestResponse> {\n  const url = getSuggestUrl(key);\n\n  if (isBrowserRuntime()) {\n    return loadBrowserJsonp<EastmoneySuggestResponse>({\n      callbackParam: \"cb\",\n      url,\n    });\n  }\n\n  return requestJson<EastmoneySuggestResponse>(url, 1);\n}\n\nfunction parseSuggestCode(item: EastmoneySuggestItem): string {\n  const quoteId = item.QuoteID || \"\";\n  const code = item.Code || quoteId.split(\".\")[1] || \"\";\n  const market = item.MktNum || quoteId.split(\".\")[0] || \"\";\n\n  if (!code) return \"\";\n  if (market === \"1\") return `SH${code}`;\n  if (market === \"0\") return `SZ${code}`;\n  return \"\";\n}\n\nfunction createMissingStock(code: string): Stock {\n  return { ...DEFAULT_STOCK, code };\n}\n\nasync function requestJsonFromHosts<T>(\n  url: string,\n  hosts: string[]\n): Promise<T> {\n  let lastError: unknown;\n\n  for (const host of hosts) {\n    try {\n      return await requestJson<T>(replaceUrlHost(url, host));\n    } catch (error) {\n      lastError = error;\n    }\n  }\n\n  throw lastError;\n}\n\nfunction replaceUrlHost(url: string, host: string): string {\n  const parsedUrl = new URL(url);\n  parsedUrl.hostname = host;\n  return parsedUrl.toString();\n}\n\nexport default Eastmoney;\n", "import {\n  COMMON_HK,\n  COMMON_SH,\n  COMMON_SZ,\n  COMMON_US,\n} from \"../../../stocks/base/utils/constant\";\nimport Stock from \"../../../types/utils/stock\";\nimport { DEFAULT_NUMBER, DEFAULT_STRING } from \"../../../utils/constant\";\n\ntype SinaMarketFields = {\n  name: number;\n  now: number;\n  low: number;\n  high: number;\n  yesterday: number;\n};\n\nconst fieldMap: Record<string, SinaMarketFields> = {\n  [COMMON_SH]: { name: 0, now: 3, low: 5, high: 4, yesterday: 2 },\n  [COMMON_SZ]: { name: 0, now: 3, low: 5, high: 4, yesterday: 2 },\n  [COMMON_HK]: { name: 1, now: 6, low: 5, high: 4, yesterday: 3 },\n  [COMMON_US]: { name: 0, now: 1, low: 7, high: 6, yesterday: 26 },\n};\n\nexport function parseSinaStock(code: string, params: string[]): Stock {\n  const fields = fieldMap[code.slice(0, 2)];\n  const now = fields ? numberAt(params, fields.now) : DEFAULT_NUMBER;\n  const yesterday = fields ? numberAt(params, fields.yesterday) : DEFAULT_NUMBER;\n\n  return {\n    code: String(code).toUpperCase(),\n    name: fields ? stringAt(params, fields.name) : DEFAULT_STRING,\n    percent: now ? now / yesterday - 1 : DEFAULT_NUMBER,\n    now,\n    low: fields ? numberAt(params, fields.low) : DEFAULT_NUMBER,\n    high: fields ? numberAt(params, fields.high) : DEFAULT_NUMBER,\n    yesterday,\n  };\n}\n\nexport function getSinaStockCode(code: string): string {\n  return String(code).toUpperCase();\n}\n\nexport function getSinaStockName(code: string, params: string[]): string {\n  const fields = fieldMap[code.slice(0, 2)];\n  return fields ? stringAt(params, fields.name) : DEFAULT_STRING;\n}\n\nexport function getSinaStockNow(code: string, params: string[]): number {\n  return getSinaStockNumber(code, params, \"now\");\n}\n\nexport function getSinaStockLow(code: string, params: string[]): number {\n  return getSinaStockNumber(code, params, \"low\");\n}\n\nexport function getSinaStockHigh(code: string, params: string[]): number {\n  return getSinaStockNumber(code, params, \"high\");\n}\n\nexport function getSinaStockYesterday(code: string, params: string[]): number {\n  return getSinaStockNumber(code, params, \"yesterday\");\n}\n\nexport function getSinaStockPercent(code: string, params: string[]): number {\n  const now = getSinaStockNow(code, params);\n  const yesterday = getSinaStockYesterday(code, params);\n  return now ? now / yesterday - 1 : DEFAULT_NUMBER;\n}\n\nconst SinaStockTransform = {\n  parse: parseSinaStock,\n  getCode: getSinaStockCode,\n  getName: getSinaStockName,\n  getNow: getSinaStockNow,\n  getLow: getSinaStockLow,\n  getHigh: getSinaStockHigh,\n  getYesterday: getSinaStockYesterday,\n  getPercent: getSinaStockPercent,\n  getStock: parseSinaStock,\n};\n\nfunction getSinaStockNumber(\n  code: string,\n  params: string[],\n  field: Exclude<keyof SinaMarketFields, \"name\">\n): number {\n  const fields = fieldMap[code.slice(0, 2)];\n  return fields ? numberAt(params, fields[field]) : DEFAULT_NUMBER;\n}\n\nfunction numberAt(params: string[], index: number): number {\n  return Number(params[index] || DEFAULT_NUMBER);\n}\n\nfunction stringAt(params: string[], index: number): string {\n  return String(params[index] || DEFAULT_STRING);\n}\n\nexport default SinaStockTransform;\n", "import {\n  COMMON_HK,\n  COMMON_SH,\n  COMMON_SZ,\n  COMMON_US,\n} from \"../base/utils/constant\";\nimport { StockCodeError } from \"../../errors\";\n\ntype Market = \"SZ\" | \"SH\" | \"HK\" | \"US\";\n\nexport type CodeMapper = {\n  transform(code: string): string;\n  transforms(codes: string[]): string[];\n  SZTransform(code: string): string;\n  SHTransform(code: string): string;\n  HKTransform(code: string): string;\n  USTransform(code: string): string;\n};\n\ntype PrefixMap = Record<Market, string>;\ntype ErrorMap = Record<Market, string>;\n\nconst commonPrefixes: PrefixMap = {\n  SZ: COMMON_SZ,\n  SH: COMMON_SH,\n  HK: COMMON_HK,\n  US: COMMON_US,\n};\n\nexport function createCodeMapper(options: {\n  inputPrefixes: PrefixMap;\n  outputPrefixes: PrefixMap;\n  unknownError: string;\n  marketErrors?: ErrorMap;\n  formatOutputCode?: (market: Market, code: string) => string;\n}): CodeMapper {\n  function transformByMarket(market: Market, code: string): string {\n    const inputPrefix = options.inputPrefixes[market];\n\n    if (code.indexOf(inputPrefix) !== 0) {\n      throw new StockCodeError(\n        options.marketErrors?.[market] || options.unknownError\n      );\n    }\n\n    const value = code.replace(inputPrefix, \"\");\n    const normalizedValue = options.formatOutputCode\n      ? options.formatOutputCode(market, value)\n      : value;\n\n    return options.outputPrefixes[market] + normalizedValue;\n  }\n\n  const mapper: CodeMapper = {\n    transform(code: string): string {\n      const market = getMarket(code, options.inputPrefixes);\n\n      if (!market) {\n        throw new StockCodeError(options.unknownError);\n      }\n\n      return transformByMarket(market, code);\n    },\n\n    transforms(codes: string[]): string[] {\n      return codes.map((code) => mapper.transform(code));\n    },\n\n    SZTransform(code: string): string {\n      return transformByMarket(\"SZ\", code);\n    },\n\n    SHTransform(code: string): string {\n      return transformByMarket(\"SH\", code);\n    },\n\n    HKTransform(code: string): string {\n      return transformByMarket(\"HK\", code);\n    },\n\n    USTransform(code: string): string {\n      return transformByMarket(\"US\", code);\n    },\n  };\n\n  return mapper;\n}\n\nexport function createUnimplementedCodeMapper(options: {\n  unknownError: string;\n  marketErrors: ErrorMap;\n}): CodeMapper {\n  function fail(market: Market): never {\n    throw new StockCodeError(options.marketErrors[market]);\n  }\n\n  const mapper: CodeMapper = {\n    transform(code: string): string {\n      const market = getMarket(code, commonPrefixes);\n\n      if (!market) {\n        throw new StockCodeError(options.unknownError);\n      }\n\n      return fail(market);\n    },\n\n    transforms(codes: string[]): string[] {\n      return codes.map((code) => mapper.transform(code));\n    },\n\n    SZTransform(): string {\n      return fail(\"SZ\");\n    },\n\n    SHTransform(): string {\n      return fail(\"SH\");\n    },\n\n    HKTransform(): string {\n      return fail(\"HK\");\n    },\n\n    USTransform(): string {\n      return fail(\"US\");\n    },\n  };\n\n  return mapper;\n}\n\nexport { commonPrefixes };\n\nfunction getMarket(code: string, prefixes: PrefixMap): Market | undefined {\n  return (Object.keys(prefixes) as Market[]).find((market) =>\n    code.startsWith(prefixes[market])\n  );\n}\n", "import {\n  COMMON_HK,\n  COMMON_SH,\n  COMMON_SZ,\n  COMMON_US,\n} from \"../../../stocks/base/utils/constant\";\nimport {\n  SINA_HK,\n  SINA_SH,\n  SINA_SZ,\n  SINA_US,\n} from \"../../../stocks/sina/utils/constant\";\nimport { ERROR_COMMON_CODE } from \"../../../utils/constant\";\nimport { createCodeMapper } from \"../../shared/code-mapper\";\n\nconst SinaCommonCodeTransform = createCodeMapper({\n  inputPrefixes: {\n    SZ: COMMON_SZ,\n    SH: COMMON_SH,\n    HK: COMMON_HK,\n    US: COMMON_US,\n  },\n  outputPrefixes: {\n    SZ: SINA_SZ,\n    SH: SINA_SH,\n    HK: SINA_HK,\n    US: SINA_US,\n  },\n  unknownError: ERROR_COMMON_CODE,\n  formatOutputCode(market, code) {\n    return market === \"US\" ? code.toLowerCase() : code;\n  },\n});\n\nexport default SinaCommonCodeTransform;\n", "// Stocks\nimport { parseSinaStock } from \"../../stocks/sina/transforms/stock\";\nimport SinaCommonCodeTransform from \"../../stocks/sina/transforms/common-code\";\n\n// Utils\nimport {\n  COMMON_HK,\n  COMMON_SH,\n  COMMON_SZ,\n  COMMON_US,\n} from \"../../stocks/base/utils/constant\";\nimport {\n  createStockProvider,\n  getAssignedValue,\n  normalizeCodes,\n} from \"../shared/provider\";\nimport { assertProviderFeatureSupported } from \"../shared/capabilities\";\nimport {\n  createKline,\n  normalizeKlineOptions,\n} from \"../shared/kline\";\nimport Kline, { KlineOptions } from \"../../types/utils/kline\";\nimport fetch from \"../../utils/fetch\";\n\ntype SinaKlineRow = {\n  close?: string;\n  day?: string;\n  high?: string;\n  low?: string;\n  open?: string;\n  volume?: string;\n};\n\nconst refererHeader = [[\"Referer\", \"https://finance.sina.com.cn/\"]] as const;\n\nfunction getQuoteUrl(apiCodes: string[]): string {\n  return `https://hq.sinajs.cn/list=${apiCodes.join(\",\")}`;\n}\n\nfunction getSearchUrl(key: string): string {\n  return `https://suggest3.sinajs.cn/suggest/type=2&key=${encodeURIComponent(\n    key\n  )}`;\n}\n\nfunction getKlineUrl(apiCode: string, options: Required<KlineOptions>): string {\n  return `https://quotes.sina.cn/cn/api/json_v2.php/CN_MarketData.getKLineData?symbol=${apiCode}&scale=${getScale(\n    options.period\n  )}&ma=no&datalen=${options.count}`;\n}\n\nasync function getKlines(code: string, options?: KlineOptions): Promise<Kline[]> {\n  assertProviderFeatureSupported(\"sina\", \"kline\");\n\n  const normalizedOptions = normalizeKlineOptions(options);\n\n  if (normalizedOptions.adjust !== \"none\") {\n    return [];\n  }\n\n  const apiCode = SinaCommonCodeTransform.transform(code);\n  const rows = await requestJson<SinaKlineRow[]>(\n    getKlineUrl(apiCode, normalizedOptions)\n  );\n\n  if (!Array.isArray(rows)) {\n    return [];\n  }\n\n  return rows.map((row) =>\n    createKline({\n      close: row.close,\n      date: row.day || \"\",\n      high: row.high,\n      low: row.low,\n      open: row.open,\n      source: \"sina\",\n      volume: row.volume,\n    })\n  );\n}\n\nasync function requestJson<T>(url: string): Promise<T> {\n  const response = await fetch\n    .get(url)\n    .set(\"Accept\", \"application/json,text/plain,*/*\")\n    .set(\"Referer\", \"https://finance.sina.com.cn/\");\n\n  return JSON.parse(response.text) as T;\n}\n\nfunction getScale(period: KlineOptions[\"period\"]): string {\n  switch (period) {\n    case \"week\":\n      return \"1200\";\n    case \"month\":\n      return \"7200\";\n    case \"day\":\n    default:\n      return \"240\";\n  }\n}\n\n/**\n * \u65B0\u6D6A\u80A1\u7968\u4EE3\u7801\u63A5\u53E3\n */\nconst Sina = createStockProvider({\n  kline: { getKlines },\n  source: \"sina\",\n  quote: {\n    codeTransform: SinaCommonCodeTransform,\n    delimiter: \",\",\n    encoding: \"gb18030\",\n    headers: refererHeader,\n    getUrl(apiCodes) {\n      return getQuoteUrl(apiCodes);\n    },\n    isMissing(row) {\n      return getAssignedValue(row) === '\"\"';\n    },\n    parseStock(code, params) {\n      return parseSinaStock(code, params);\n    },\n  },\n  search: {\n    encoding: \"gb18030\",\n    headers: refererHeader,\n    getUrl(key) {\n      return getSearchUrl(key);\n    },\n    parseCodes(body) {\n      const rows = body\n        .replace('var suggestvalue=\"', \"\")\n        .replace('\";', \"\")\n        .split(\";\");\n\n      const codes = rows.flatMap((row) => {\n        const code = row.split(\",\")[0];\n\n        if (code.indexOf(\"us\") === 0) {\n          return [COMMON_US + code.replace(\"us\", \"\")];\n        }\n\n        if (code.indexOf(\"sz\") === 0) {\n          return [COMMON_SZ + code.replace(\"sz\", \"\")];\n        }\n\n        if (code.indexOf(\"sh\") === 0) {\n          return [COMMON_SH + code.replace(\"sh\", \"\")];\n        }\n\n        if (code.indexOf(\"hk\") === 0) {\n          return [COMMON_HK + code.replace(\"hk\", \"\")];\n        }\n\n        if (code.indexOf(\"of\") === 0) {\n          const fundCode = code.replace(\"of\", \"\");\n          return [COMMON_SZ + fundCode, COMMON_SH + fundCode];\n        }\n\n        return [];\n      });\n\n      return normalizeCodes(codes);\n    },\n  },\n});\n\nexport default Sina;\n", "import Stock from \"../../../types/utils/stock\";\nimport { DEFAULT_NUMBER, DEFAULT_STRING } from \"../../../utils/constant\";\n\nexport function parseTencentStock(code: string, params: string[]): Stock {\n  const now = getTencentStockNow(params);\n  const yesterday = getTencentStockYesterday(params);\n\n  return {\n    code: getTencentStockCode(code),\n    name: getTencentStockName(params),\n    percent: now ? now / yesterday - 1 : DEFAULT_NUMBER,\n    now,\n    low: getTencentStockLow(params),\n    high: getTencentStockHigh(params),\n    yesterday,\n  };\n}\n\nexport function getTencentStockCode(code: string): string {\n  return String(code).toUpperCase();\n}\n\nexport function getTencentStockName(params: string[]): string {\n  return String(params[1] || DEFAULT_STRING);\n}\n\nexport function getTencentStockNow(params: string[]): number {\n  return numberAt(params, 3);\n}\n\nexport function getTencentStockLow(params: string[]): number {\n  return numberAt(params, 34);\n}\n\nexport function getTencentStockHigh(params: string[]): number {\n  return numberAt(params, 33);\n}\n\nexport function getTencentStockYesterday(params: string[]): number {\n  return numberAt(params, 4);\n}\n\nexport function getTencentStockPercent(params: string[]): number {\n  const now = getTencentStockNow(params);\n  const yesterday = getTencentStockYesterday(params);\n  return now ? now / yesterday - 1 : DEFAULT_NUMBER;\n}\n\nconst TencentStockTransform = {\n  parse: parseTencentStock,\n  getCode: getTencentStockCode,\n  getName: getTencentStockName,\n  getNow: getTencentStockNow,\n  getLow: getTencentStockLow,\n  getHigh: getTencentStockHigh,\n  getYesterday: getTencentStockYesterday,\n  getPercent: getTencentStockPercent,\n  getStock: parseTencentStock,\n};\n\nfunction numberAt(params: string[], index: number): number {\n  return Number(params[index] || DEFAULT_NUMBER);\n}\n\nexport default TencentStockTransform;\n", "import {\n  COMMON_HK,\n  COMMON_SH,\n  COMMON_SZ,\n  COMMON_US,\n} from \"../../../stocks/base/utils/constant\";\nimport {\n  TENCENT_HK,\n  TENCENT_SH,\n  TENCENT_SZ,\n  TENCENT_US,\n} from \"../../../stocks/tencent/utils/constant\";\nimport { ERROR_COMMON_CODE } from \"../../../utils/constant\";\nimport { createCodeMapper } from \"../../shared/code-mapper\";\n\nconst TencentCommonCodeTransform = createCodeMapper({\n  inputPrefixes: {\n    SZ: COMMON_SZ,\n    SH: COMMON_SH,\n    HK: COMMON_HK,\n    US: COMMON_US,\n  },\n  outputPrefixes: {\n    SZ: TENCENT_SZ,\n    SH: TENCENT_SH,\n    HK: TENCENT_HK,\n    US: TENCENT_US,\n  },\n  unknownError: ERROR_COMMON_CODE,\n  formatOutputCode(market, code) {\n    return market === \"HK\" || market === \"US\" ? code.toUpperCase() : code;\n  },\n});\n\nexport default TencentCommonCodeTransform;\n", "// Stocks\nimport { parseTencentStock } from \"../../stocks/tencent/transforms/stock\";\nimport TencentCommonCodeTransform from \"../../stocks/tencent/transforms/common-code\";\n\n// Utils\nimport {\n  COMMON_HK,\n  COMMON_SH,\n  COMMON_SZ,\n  COMMON_US,\n} from \"../../stocks/base/utils/constant\";\nimport { createStockProvider, normalizeCodes } from \"../shared/provider\";\nimport { assertProviderFeatureSupported } from \"../shared/capabilities\";\nimport {\n  createKline,\n  normalizeKlineOptions,\n} from \"../shared/kline\";\nimport Kline, { KlineOptions } from \"../../types/utils/kline\";\nimport fetch from \"../../utils/fetch\";\nimport { loadBrowserScriptValue } from \"../../utils/browser-script\";\n\ntype TencentKlineResponse = {\n  data?: Record<string, Record<string, string[][]>>;\n};\n\nfunction getSearchUrl(key: string): string {\n  return `https://smartbox.gtimg.cn/s3/?v=2&t=all&c=1&q=${encodeURIComponent(\n    key\n  )}`;\n}\n\nasync function requestBrowserSearchText(key: string): Promise<string> {\n  const value = await loadBrowserScriptValue({\n    charset: \"gbk\",\n    url: getSearchUrl(key),\n    variableName: \"v_hint\",\n  });\n\n  return `v_hint=\"${value}\"`;\n}\n\nasync function getKlines(code: string, options?: KlineOptions): Promise<Kline[]> {\n  assertProviderFeatureSupported(\"tencent\", \"kline\");\n\n  const normalizedOptions = normalizeKlineOptions(options);\n  const apiCode = TencentCommonCodeTransform.transform(code);\n  const endpoint =\n    normalizedOptions.adjust === \"none\" ? \"kline/kline\" : \"fqkline/get\";\n  const adjustPrefix =\n    normalizedOptions.adjust === \"none\" ? \"\" : normalizedOptions.adjust;\n  const dataKey = `${adjustPrefix}${normalizedOptions.period}`;\n  const adjustParam =\n    normalizedOptions.adjust === \"none\" ? \"\" : `,${normalizedOptions.adjust}`;\n  const url = `https://web.ifzq.gtimg.cn/appstock/app/${endpoint}?param=${apiCode},${normalizedOptions.period},,,${normalizedOptions.count}${adjustParam}`;\n  const response = await requestJson<TencentKlineResponse>(url);\n  const rows = response.data?.[apiCode]?.[dataKey] || [];\n\n  return rows.map(([date, open, close, high, low, volume]) =>\n    createKline({\n      close,\n      date,\n      high,\n      low,\n      open,\n      source: \"tencent\",\n      volume,\n    })\n  );\n}\n\nasync function requestJson<T>(url: string): Promise<T> {\n  const response = await fetch.get(url).set(\"Accept\", \"application/json,text/plain,*/*\");\n  return JSON.parse(response.text) as T;\n}\n\n/**\n * \u817E\u8BAF\u80A1\u7968\u4EE3\u7801\u63A5\u53E3\n */\nconst Tencent = createStockProvider({\n  kline: { getKlines },\n  source: \"tencent\",\n  quote: {\n    codeTransform: TencentCommonCodeTransform,\n    delimiter: \"~\",\n    encoding: \"gbk\",\n    getUrl(apiCodes) {\n      return `https://qt.gtimg.cn/q=${apiCodes.join(\",\")}`;\n    },\n    isMissing(row, apiCode) {\n      return !row.includes(apiCode);\n    },\n    parseStock(code, params) {\n      return parseTencentStock(code, params);\n    },\n  },\n  search: {\n    browserRequestText: requestBrowserSearchText,\n    encoding: \"gbk\",\n    getUrl(key) {\n      return getSearchUrl(key);\n    },\n    parseCodes(body) {\n      const rows = body.replace('v_hint=\"', \"\").replace('\"', \"\").split(\"^\");\n      const codes = rows.map((row) => {\n        const [type, code] = row.split(\"~\");\n\n        switch (type) {\n          case \"sz\":\n            return COMMON_SZ + code;\n          case \"sh\":\n            return COMMON_SH + code;\n          case \"hk\":\n            return COMMON_HK + code;\n          case \"us\":\n            return COMMON_US + code.split(\".\")[0].toUpperCase();\n          default:\n            return \"\";\n        }\n      });\n\n      return normalizeCodes(codes);\n    },\n  },\n});\n\nexport default Tencent;\n", "import { DEFAULT_STOCK } from \"../../utils/constant\";\nimport StockApi from \"../../types/stocks\";\nimport Kline, { KlineOptions } from \"../../types/utils/kline\";\nimport Stock, { StockSource } from \"../../types/utils/stock\";\nimport eastmoney from \"../eastmoney\";\nimport sina from \"../sina\";\nimport { normalizeStock } from \"../shared/normalize\";\nimport {\n  normalizeCodes,\n  StockProviderApi,\n  StockProviderInspection,\n} from \"../shared/provider\";\nimport tencent from \"../tencent\";\n\nexport type AutoStockProvider = {\n  name: Exclude<StockSource, \"base\">;\n  api: StockProviderApi;\n};\n\nexport type AutoStockInspection = {\n  code: string;\n  source: StockSource;\n  stock: Stock;\n  sources: StockProviderInspection[];\n};\n\nexport interface AutoStockApi extends StockApi {\n  inspectStock(code: string): Promise<AutoStockInspection>;\n}\n\nconst providers: AutoStockProvider[] = [\n  { name: \"tencent\", api: tencent },\n  { name: \"sina\", api: sina },\n  { name: \"eastmoney\", api: eastmoney },\n];\n\nexport function createAutoStockApi(autoProviders: AutoStockProvider[]): AutoStockApi {\n  const api: AutoStockApi = {\n    async getStock(code: string): Promise<Stock> {\n      return (await api.inspectStock(code)).stock;\n    },\n\n    async getStocks(codes: string[]): Promise<Stock[]> {\n      return Promise.all(normalizeCodes(codes).map((code) => api.getStock(code)));\n    },\n\n    async getKlines(code: string, options?: KlineOptions): Promise<Kline[]> {\n      for (const provider of getKlineProviders(autoProviders)) {\n        const klines = await getProviderKlines(provider, code, options);\n\n        if (klines.length > 0) {\n          return klines;\n        }\n      }\n\n      return [];\n    },\n\n    async searchStocks(key: string): Promise<Stock[]> {\n      for (const provider of autoProviders) {\n        const stocks = await searchProviderStocks(provider, key);\n        const availableStocks = stocks.filter(isAvailableStock);\n\n        if (availableStocks.length > 0) {\n          return availableStocks.map((stock) =>\n            normalizeStock(stock, provider.name)\n          );\n        }\n      }\n\n      return [];\n    },\n\n    async inspectStock(code: string): Promise<AutoStockInspection> {\n      const sources: StockProviderInspection[] = [];\n      let selectedStock: Stock | undefined;\n      let selectedSource: StockSource = \"base\";\n\n      for (const provider of autoProviders) {\n        const inspection = await provider.api.inspectStock(code);\n        sources.push(inspection);\n\n        if (!selectedStock && inspection.status === \"success\" && inspection.stock) {\n          selectedStock = inspection.stock;\n          selectedSource = inspection.source;\n        }\n      }\n\n      const stock = selectedStock || normalizeStock({ ...DEFAULT_STOCK, code }, \"base\");\n\n      return {\n        code,\n        source: selectedSource,\n        stock,\n        sources,\n      };\n    },\n  };\n\n  return api;\n}\n\nconst Auto = createAutoStockApi(providers);\n\nfunction getKlineProviders(autoProviders: AutoStockProvider[]): AutoStockProvider[] {\n  const order = new Map<AutoStockProvider[\"name\"], number>([\n    [\"tencent\", 0],\n    [\"sina\", 1],\n    [\"eastmoney\", 2],\n  ]);\n\n  return [...autoProviders].sort(\n    (left, right) =>\n      (order.get(left.name) ?? Number.MAX_SAFE_INTEGER) -\n      (order.get(right.name) ?? Number.MAX_SAFE_INTEGER)\n  );\n}\n\nasync function getProviderKlines(\n  provider: AutoStockProvider,\n  code: string,\n  options?: KlineOptions\n): Promise<Kline[]> {\n  try {\n    return await provider.api.getKlines(code, options);\n  } catch {\n    return [];\n  }\n}\n\nasync function searchProviderStocks(\n  provider: AutoStockProvider,\n  key: string\n): Promise<Stock[]> {\n  try {\n    return await provider.api.searchStocks(key);\n  } catch {\n    return [];\n  }\n}\n\nfunction isAvailableStock(stock: Stock | undefined): stock is Stock {\n  return Boolean(stock && stock.name !== DEFAULT_STOCK.name);\n}\n\nexport default Auto;\n", "// Utils\nimport {\n  ERROR_UNDEFINED_GET_STOCK,\n  ERROR_UNDEFINED_GET_STOCKS,\n  ERROR_UNDEFINED_GET_KLINES,\n  ERROR_UNDEFINED_SEARCH_STOCK,\n} from \"../../utils/constant\";\n\n// Types\nimport Kline, { KlineOptions } from \"../../types/utils/kline\";\nimport Stock from \"../../types/utils/stock\";\nimport StockApi from \"../../types/stocks/index\";\n\n/**\n * \u57FA\u7840\u80A1\u7968\u4EE3\u7801\u63A5\u53E3\n */\nconst Base: StockApi = {\n  /**\n   * \u83B7\u53D6\u80A1\u7968\u6570\u636E\n   * @param code \u80A1\u7968\u4EE3\u7801\n   */\n  async getStock(_code: string): Promise<Stock> {\n    throw new Error(ERROR_UNDEFINED_GET_STOCK);\n  },\n\n  /**\n   * \u83B7\u53D6\u80A1\u7968\u6570\u636E\u7EC4\n   * @param codes \u80A1\u7968\u4EE3\u7801\u7EC4\n   */\n  async getStocks(_codes: string[]): Promise<Stock[]> {\n    throw new Error(ERROR_UNDEFINED_GET_STOCKS);\n  },\n\n  /**\n   * \u83B7\u53D6 K \u7EBF\u6570\u636E\n   * @param code \u80A1\u7968\u4EE3\u7801\n   */\n  async getKlines(_code: string, _options?: KlineOptions): Promise<Kline[]> {\n    throw new Error(ERROR_UNDEFINED_GET_KLINES);\n  },\n\n  /**\n   * \u641C\u7D22\u80A1\u7968\u4EE3\u7801\n   * @param key \u5173\u952E\u5B57\n   */\n  async searchStocks(_key: string): Promise<Stock[]> {\n    throw new Error(ERROR_UNDEFINED_SEARCH_STOCK);\n  },\n};\n\nexport default Base;\n", "// Stocks\nimport auto from \"./auto\";\nimport base from \"./base\";\nimport eastmoney from \"./eastmoney\";\nimport sina from \"./sina\";\nimport tencent from \"./tencent\";\nimport { getProviderCapabilities } from \"./shared/capabilities\";\n\nexport type StockProviderName = \"eastmoney\" | \"sina\" | \"tencent\";\n\nconst sourceNames: StockProviderName[] = [\"tencent\", \"sina\", \"eastmoney\"];\n\nexport function getSources(): StockProviderName[] {\n  return [...sourceNames];\n}\n\nexport { auto, base, eastmoney, getProviderCapabilities, sina, tencent };\n\nexport default {\n  auto,\n  base,\n  eastmoney,\n  getProviderCapabilities,\n  getSources,\n  sina,\n  tencent,\n};\n", "// Stocks\nimport stocks from \"./stocks/index\";\n\nexport { stocks };\nexport {\n  StockApiError,\n  StockCodeError,\n  StockParseError,\n  StockRequestError,\n} from \"./errors\";\nexport default { stocks };\n"],
  "mappings": "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",
  "names": ["ERROR_COMMON_CODE", "ERROR_UNDEFINED_GET_STOCK", "ERROR_UNDEFINED_GET_STOCKS", "ERROR_UNDEFINED_GET_KLINES", "ERROR_UNDEFINED_SEARCH_STOCK", "DEFAULT_STOCK", "StockApiError", "message", "StockRequestError", "StockCodeError", "StockParseError", "isBrowserRuntime", "loadBrowserScript", "options", "document", "parent", "StockRequestError", "resolve", "reject", "script", "timeout", "timeoutId", "cleanup", "loadBrowserScriptValue", "runtime", "value", "loadBrowserJsonp", "callbackParam", "callbackName", "result", "url", "appendQueryParam", "name", "separator", "RequestBuilder", "url", "name", "value", "_type", "count", "ms", "onfulfilled", "onrejected", "lastError", "attempt", "request", "error", "options", "StockRequestError", "controller", "timeoutId", "response", "createRequestHeaders", "status", "body", "result", "getResponseHeaders", "isAbortError", "headers", "isBrowserForbiddenHeader", "isBrowser", "requestClient", "fetch_default", "supported", "sinaBrowserUnsupported", "capabilities", "getProviderCapabilities", "capability", "cloneRuntimeCapability", "assertProviderFeatureSupported", "source", "feature", "runtime", "isBrowserRuntime", "support", "StockRequestError", "defaultOptions", "normalizeKlineOptions", "options", "normalizeAdjust", "normalizeCount", "normalizePeriod", "parseKlineNumber", "value", "number", "createKline", "row", "kline", "normalizePeriod", "period", "defaultOptions", "normalizeAdjust", "adjust", "normalizeCount", "count", "uniq", "items", "normalizeEncoding", "encoding", "iconv", "body", "iconv_default", "normalizeStock", "stock", "source", "normalizeCodes", "codes", "uniq", "code", "createMissingStock", "DEFAULT_STOCK", "splitRows", "body", "row", "getAssignedValue", "value", "getDelimitedParams", "delimiter", "createStockProvider", "config", "getStocks", "normalizedCodes", "assertProviderFeatureSupported", "apiCodes", "requestQuoteText", "rows", "index", "apiCode", "item", "params", "quote", "isBrowserRuntime", "requestText", "api", "stock", "options", "key", "requestSearchText", "createStockInspection", "search", "source", "getStock", "normalizeStock", "isAvailableStock", "error", "getErrorMessage", "req", "fetch_default", "name", "res", "iconv_default", "transformEastmoneyCommonCode", "code", "normalizedCode", "StockCodeError", "ERROR_COMMON_CODE", "EastmoneyCommonCodeTransform", "codes", "common_code_default", "parseEastmoneyStock", "code", "quote", "now", "getEastmoneyStockNow", "yesterday", "getEastmoneyStockYesterday", "percentValue", "numberValue", "getEastmoneyStockCode", "getEastmoneyStockName", "getEastmoneyStockLow", "getEastmoneyStockHigh", "numberValue", "value", "next", "quoteFields", "klineFields", "suggestToken", "requestTimeoutMs", "defaultPush2Host", "defaultPush2HisHost", "push2HisHosts", "getSuggestUrl", "key", "getStocks", "codes", "normalizedCodes", "normalizeCodes", "assertProviderFeatureSupported", "fetchOneStock", "Eastmoney", "code", "stock", "createMissingStock", "options", "getKlines", "requestSuggestJson", "parseSuggestCode", "createStockInspection", "normalizedOptions", "normalizeKlineOptions", "apiCode", "common_code_default", "url", "getKlinePeriodCode", "getAdjustCode", "requestJsonFromHosts", "line", "date", "open", "close", "high", "low", "volume", "createKline", "quote", "requestQuote", "parseEastmoneyStock", "requestJson", "retries", "lastError", "attempt", "response", "fetch_default", "error", "period", "adjust", "isBrowserRuntime", "loadBrowserJsonp", "item", "quoteId", "market", "DEFAULT_STOCK", "hosts", "host", "replaceUrlHost", "parsedUrl", "eastmoney_default", "fieldMap", "parseSinaStock", "code", "params", "fields", "now", "numberAt", "yesterday", "stringAt", "numberAt", "params", "index", "stringAt", "createCodeMapper", "options", "transformByMarket", "market", "code", "inputPrefix", "StockCodeError", "value", "normalizedValue", "mapper", "getMarket", "codes", "getMarket", "code", "prefixes", "market", "SinaCommonCodeTransform", "createCodeMapper", "ERROR_COMMON_CODE", "market", "code", "common_code_default", "refererHeader", "getQuoteUrl", "apiCodes", "getSearchUrl", "key", "getKlineUrl", "apiCode", "options", "getScale", "getKlines", "code", "assertProviderFeatureSupported", "normalizedOptions", "normalizeKlineOptions", "common_code_default", "rows", "requestJson", "row", "createKline", "url", "response", "fetch_default", "period", "Sina", "createStockProvider", "getAssignedValue", "params", "parseSinaStock", "body", "codes", "fundCode", "normalizeCodes", "sina_default", "parseTencentStock", "code", "params", "now", "getTencentStockNow", "yesterday", "getTencentStockYesterday", "getTencentStockCode", "getTencentStockName", "getTencentStockLow", "getTencentStockHigh", "numberAt", "numberAt", "params", "index", "TencentCommonCodeTransform", "createCodeMapper", "ERROR_COMMON_CODE", "market", "code", "common_code_default", "getSearchUrl", "key", "requestBrowserSearchText", "loadBrowserScriptValue", "getKlines", "code", "options", "assertProviderFeatureSupported", "normalizedOptions", "normalizeKlineOptions", "apiCode", "common_code_default", "endpoint", "dataKey", "adjustParam", "url", "requestJson", "date", "open", "close", "high", "low", "volume", "createKline", "response", "fetch_default", "Tencent", "createStockProvider", "apiCodes", "row", "params", "parseTencentStock", "body", "codes", "type", "normalizeCodes", "tencent_default", "providers", "tencent_default", "sina_default", "eastmoney_default", "createAutoStockApi", "autoProviders", "api", "code", "codes", "normalizeCodes", "options", "provider", "getKlineProviders", "klines", "getProviderKlines", "key", "availableStocks", "searchProviderStocks", "isAvailableStock", "stock", "normalizeStock", "sources", "selectedStock", "selectedSource", "inspection", "DEFAULT_STOCK", "Auto", "order", "left", "right", "auto_default", "Base", "_code", "ERROR_UNDEFINED_GET_STOCK", "_codes", "ERROR_UNDEFINED_GET_STOCKS", "_options", "ERROR_UNDEFINED_GET_KLINES", "_key", "ERROR_UNDEFINED_SEARCH_STOCK", "base_default", "sourceNames", "getSources", "stocks_default", "auto_default", "base_default", "eastmoney_default", "getProviderCapabilities", "getSources", "sina_default", "tencent_default", "index_default", "stocks_default"]
}
