@simoko/tw-zip
Version:
台灣縣市、行政區、郵遞區號(3碼/6碼)查詢工具,支援 React/Vue/Svelte/SolidJS/Angular
1 lines • 4.73 kB
Source Map (JSON)
{"version":3,"sources":["../../src/zip6/loader.ts"],"names":["DEFAULT_BASE_URL","cityDataCache","citiesData","citiesDataPromise","loadCitiesData","options","baseUrl","res","data","error","loadCityData","city","trimmedCity","cached","response","preloadCities","cities","getCachedCityData","isCityCached","clearCache"],"mappings":"aAcA,IAAMA,CAAAA,CAAmB,wDAGnBC,CAAAA,CAAgB,IAAI,IACtBC,CAAAA,CAAgC,IAAA,CAChCC,EAAgD,IAAA,CASpD,eAAsBC,EAAeC,CAAAA,CAAyB,GAAyB,CACrF,GAAIH,EACF,OAAOA,CAAAA,CAGT,GAAIC,CAAAA,CACF,OAAOA,CAAAA,CAGT,IAAMG,CAAAA,CAAUD,CAAAA,CAAQ,SAAWL,CAAAA,CAEnC,OAAAG,EAAoB,KAAA,CAAM,CAAA,EAAGG,CAAO,CAAA,YAAA,CAAc,CAAA,CAC/C,KAAMC,CAAAA,EAAQ,CACb,GAAI,CAACA,CAAAA,CAAI,GACP,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoCA,CAAAA,CAAI,MAAM,EAAE,CAAA,CAElE,OAAOA,EAAI,IAAA,EACb,CAAC,CAAA,CACA,IAAA,CAAMC,IACLN,CAAAA,CAAaM,CAAAA,CACNA,EACR,CAAA,CACA,KAAA,CAAOC,GAAU,CAEhB,MAAAN,EAAoB,IAAA,CACdM,CACR,CAAC,CAAA,CAEIN,CACT,CAKA,eAAsBO,CAAAA,CAAaC,CAAAA,CAAcN,EAAyB,EAAC,CAA0B,CACnG,IAAMO,CAAAA,CAAcD,EAAK,IAAA,EAAK,CAC9B,GAAI,CAACC,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,2BAA2B,CAAA,CAG7C,IAAMC,CAAAA,CAASZ,CAAAA,CAAc,GAAA,CAAIW,CAAW,EAC5C,GAAIC,CAAAA,CACF,OAAOA,CAAAA,CAGT,IAAMP,EAAUD,CAAAA,CAAQ,OAAA,EAAWL,EAE7Bc,CAAAA,CAAW,MAAM,MAAM,CAAA,EAAGR,CAAO,IAAI,kBAAA,CAAmBM,CAAW,CAAC,CAAA,KAAA,CAAO,CAAA,CACjF,GAAI,CAACE,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,gCAAgCF,CAAW,CAAA,OAAA,EAAUE,EAAS,MAAM,CAAA,CAAE,EAGxF,IAAMN,CAAAA,CAAO,MAAMM,CAAAA,CAAS,IAAA,GAE5B,OAAAb,CAAAA,CAAc,IAAIW,CAAAA,CAAaJ,CAAI,CAAA,CAC5BA,CACT,CAKA,eAAsBO,EAAcC,CAAAA,CAAkBX,CAAAA,CAAyB,EAAC,CAAkB,CAChG,MAAM,OAAA,CAAQ,GAAA,CAAIW,EAAO,GAAA,CAAIL,CAAAA,EAAQD,EAAaC,CAAAA,CAAMN,CAAO,CAAC,CAAC,EACnE,CAKO,SAASY,CAAAA,CAAkBN,CAAAA,CAAwC,CACxE,OAAOV,CAAAA,CAAc,IAAIU,CAAI,CAC/B,CAKO,SAASO,CAAAA,CAAaP,EAAuB,CAClD,OAAOV,EAAc,GAAA,CAAIU,CAAI,CAC/B,CAKO,SAASQ,GAAmB,CACjClB,CAAAA,CAAc,OAAM,CACpBC,CAAAA,CAAa,IAAA,CACbC,CAAAA,CAAoB,KACtB","file":"loader.cjs","sourcesContent":["/**\n * 動態載入 zip6 資料\n */\n\nexport type AreaData = Record<string, string>\nexport type CityAreaData = Record<string, AreaData>\nexport type Zip3Map = Record<string, Record<string, string>>\n\nexport interface CitiesData {\n cities: string[]\n zip3: Zip3Map\n}\n\n// 預設使用 jsDelivr CDN\nconst DEFAULT_BASE_URL = 'https://cdn.jsdelivr.net/npm/@simoko/tw-zip/data/zip6'\n\n// 快取\nconst cityDataCache = new Map<string, CityAreaData>()\nlet citiesData: CitiesData | null = null\nlet citiesDataPromise: Promise<CitiesData> | null = null\n\nexport interface LoaderOptions {\n baseUrl?: string\n}\n\n/**\n * 載入縣市列表和 zip3 對照表\n */\nexport async function loadCitiesData(options: LoaderOptions = {}): Promise<CitiesData> {\n if (citiesData) {\n return citiesData\n }\n\n if (citiesDataPromise) {\n return citiesDataPromise\n }\n\n const baseUrl = options.baseUrl || DEFAULT_BASE_URL\n\n citiesDataPromise = fetch(`${baseUrl}/cities.json`)\n .then((res) => {\n if (!res.ok) {\n throw new Error(`Failed to load cities data: HTTP ${res.status}`)\n }\n return res.json()\n })\n .then((data: CitiesData) => {\n citiesData = data\n return data\n })\n .catch((error) => {\n // 清除 promise 以允許重試\n citiesDataPromise = null\n throw error\n })\n\n return citiesDataPromise\n}\n\n/**\n * 載入指定縣市的資料\n */\nexport async function loadCityData(city: string, options: LoaderOptions = {}): Promise<CityAreaData> {\n const trimmedCity = city.trim()\n if (!trimmedCity) {\n throw new Error('City name cannot be empty')\n }\n\n const cached = cityDataCache.get(trimmedCity)\n if (cached) {\n return cached\n }\n\n const baseUrl = options.baseUrl || DEFAULT_BASE_URL\n\n const response = await fetch(`${baseUrl}/${encodeURIComponent(trimmedCity)}.json`)\n if (!response.ok) {\n throw new Error(`Failed to load city data for ${trimmedCity}: HTTP ${response.status}`)\n }\n\n const data = await response.json() as CityAreaData\n\n cityDataCache.set(trimmedCity, data)\n return data\n}\n\n/**\n * 預載入指定縣市\n */\nexport async function preloadCities(cities: string[], options: LoaderOptions = {}): Promise<void> {\n await Promise.all(cities.map(city => loadCityData(city, options)))\n}\n\n/**\n * 取得已快取的縣市資料(同步)\n */\nexport function getCachedCityData(city: string): CityAreaData | undefined {\n return cityDataCache.get(city)\n}\n\n/**\n * 檢查縣市資料是否已快取\n */\nexport function isCityCached(city: string): boolean {\n return cityDataCache.has(city)\n}\n\n/**\n * 清除快取\n */\nexport function clearCache(): void {\n cityDataCache.clear()\n citiesData = null\n citiesDataPromise = null\n}\n"]}