UNPKG

@simoko/tw-zip

Version:

台灣縣市、行政區、郵遞區號(3碼/6碼)查詢工具,支援 React/Vue/Svelte/SolidJS/Angular

1 lines 22 kB
{"version":3,"sources":["../../src/zip6/loader.ts","../../src/solidjs/lazy.ts"],"names":["DEFAULT_BASE_URL","cityDataCache","citiesData","citiesDataPromise","loadCitiesData","options","baseUrl","res","data","error","loadCityData","city","trimmedCity","cached","response","preloadCities","cities","isCityCached","clearCache","parsedRulesCache","parseRules","rulesStr","parsed","rule","parts","calculateZipCode","area","road","number","lane","alley","cityData","zip3Map","areaData","zip3","rules","suffix","even","rLane","rLane1","rAlley","rAlley1","noBgn","_noBgn1","noEnd","maxNo","useTwZip6","preload","loading","setLoading","createSignal","setCities","setZip3Map","setCityState","setAreaState","setRoadState","setNumber","setLane","setAlley","areas","setAreas","roads","setRoads","searchResults","setSearchResults","setCityData","requestId","init","firstCity","firstCityData","newAreas","areaDataObj","newRoads","setCity","value","currentRequestId","newCityData","setArea","currentCityData","setRoad","searchRoads","keyword","results","trimmed","currentCity","a","r","result","createMemo","zipCode","citiesToPreload","lazy_default"],"mappings":"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","file":"lazy.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","import type { CityAreaData, Zip3Map } from '../zip6/loader'\nimport { createMemo, createSignal } from 'solid-js'\nimport {\n clearCache,\n isCityCached,\n loadCitiesData,\n loadCityData,\n preloadCities,\n} from '../zip6/loader'\n\nexport interface SearchResult {\n city: string\n area: string\n road: string\n}\n\nexport interface Zip6Result {\n zipcode: string\n zip3: string\n city: string\n area: string\n road: string\n}\n\nexport interface UseTwZip6Options {\n baseUrl?: string\n preload?: string[]\n}\n\n// 規則解析快取\nconst parsedRulesCache = new Map<string, Array<[string, ...number[]]>>()\n\nfunction parseRules(rulesStr: string): Array<[string, ...number[]]> {\n if (!rulesStr) return []\n\n const cached = parsedRulesCache.get(rulesStr)\n if (cached) return cached\n\n const parsed = rulesStr.split('|').map((rule) => {\n const parts = rule.split(',')\n return [parts[0], ...parts.slice(1).map(Number)] as [string, ...number[]]\n })\n\n parsedRulesCache.set(rulesStr, parsed)\n return parsed\n}\n\nfunction calculateZipCode(\n city: string,\n area: string,\n road: string,\n number: number | undefined,\n lane: number | undefined,\n alley: number | undefined,\n cityData: CityAreaData | undefined,\n zip3Map: Zip3Map,\n): Zip6Result | undefined {\n if (!cityData) return undefined\n\n const areaData = cityData[area]\n if (!areaData) return undefined\n\n const rulesStr = areaData[road]\n if (!rulesStr) return undefined\n\n const zip3 = zip3Map[city]?.[area]\n if (!zip3) return undefined\n\n const rules = parseRules(rulesStr)\n\n for (const rule of rules) {\n const [suffix, even = 0, rLane = 0, rLane1 = 0, rAlley = 0, rAlley1 = 0, noBgn = 0, _noBgn1 = 0, noEnd = 0] = rule\n\n if (rLane > 0 || rLane1 > 0) {\n if (!lane) continue\n if (rLane > 0 && rLane1 > 0) {\n if (lane < rLane || lane > rLane1) continue\n }\n else if (rLane > 0) {\n if (noEnd === 9999 || noEnd === 9998) {\n if (lane < rLane) continue\n }\n else if (lane !== rLane) {\n continue\n }\n }\n }\n\n if (rAlley > 0 || rAlley1 > 0) {\n if (!alley) continue\n if (rAlley > 0 && rAlley1 > 0) {\n if (alley < rAlley || alley > rAlley1) continue\n }\n else if (rAlley > 0 && alley !== rAlley) {\n continue\n }\n }\n\n if (number !== undefined && (noBgn > 0 || noEnd > 0)) {\n if (even === 1 && number % 2 === 0) continue\n if (even === 2 && number % 2 === 1) continue\n\n const maxNo = noEnd === 9999 || noEnd === 9998 ? Number.POSITIVE_INFINITY : noEnd\n if (noBgn > 0 && number < noBgn) continue\n if (maxNo !== Number.POSITIVE_INFINITY && number > maxNo) continue\n }\n else if (even !== 0 && number !== undefined) {\n if (even === 1 && number % 2 === 0) continue\n if (even === 2 && number % 2 === 1) continue\n }\n\n return { zipcode: zip3 + suffix, zip3, city, area, road }\n }\n\n if (rules.length > 0) {\n const [suffix] = rules[0]\n return { zipcode: zip3 + suffix, zip3, city, area, road }\n }\n\n return undefined\n}\n\nexport function useTwZip6(options: UseTwZip6Options = {}) {\n const { baseUrl, preload } = options\n\n const [loading, setLoading] = createSignal(true)\n const [cities, setCities] = createSignal<string[]>([])\n const [zip3Map, setZip3Map] = createSignal<Zip3Map>({})\n\n const [city, setCityState] = createSignal('')\n const [area, setAreaState] = createSignal('')\n const [road, setRoadState] = createSignal('')\n const [number, setNumber] = createSignal<number | undefined>(undefined)\n const [lane, setLane] = createSignal<number | undefined>(undefined)\n const [alley, setAlley] = createSignal<number | undefined>(undefined)\n\n const [areas, setAreas] = createSignal<string[]>([])\n const [roads, setRoads] = createSignal<string[]>([])\n const [searchResults, setSearchResults] = createSignal<SearchResult[]>([])\n const [cityData, setCityData] = createSignal<CityAreaData | undefined>(undefined)\n\n // 用於追蹤最新請求\n let requestId = 0\n\n // 初始化\n async function init() {\n setLoading(true)\n const data = await loadCitiesData({ baseUrl })\n\n setCities(data.cities)\n setZip3Map(data.zip3)\n\n const firstCity = data.cities[0] ?? ''\n setCityState(firstCity)\n\n if (preload && preload.length > 0) {\n await preloadCities(preload, { baseUrl })\n }\n\n if (firstCity) {\n const firstCityData = await loadCityData(firstCity, { baseUrl })\n setCityData(firstCityData)\n const newAreas = Object.keys(firstCityData)\n setAreas(newAreas)\n setAreaState(newAreas[0] ?? '')\n\n if (newAreas[0]) {\n const areaDataObj = firstCityData[newAreas[0]]\n if (areaDataObj) {\n const newRoads = Object.keys(areaDataObj)\n setRoads(newRoads)\n setRoadState(newRoads[0] ?? '')\n }\n }\n }\n\n setLoading(false)\n }\n\n // 啟動初始化\n init()\n\n // 切換縣市\n async function setCity(value: string) {\n const currentRequestId = ++requestId\n setCityState(value)\n setLoading(true)\n\n try {\n const newCityData = await loadCityData(value, { baseUrl })\n\n if (requestId !== currentRequestId) return\n\n setCityData(newCityData)\n const newAreas = Object.keys(newCityData)\n setAreas(newAreas)\n setAreaState(newAreas[0] ?? '')\n setRoads([])\n setRoadState('')\n setNumber(undefined)\n setLane(undefined)\n setAlley(undefined)\n\n if (newAreas[0]) {\n const areaDataObj = newCityData[newAreas[0]]\n if (areaDataObj) {\n const newRoads = Object.keys(areaDataObj)\n setRoads(newRoads)\n setRoadState(newRoads[0] ?? '')\n }\n }\n }\n catch (error) {\n if (requestId === currentRequestId) {\n console.error(`Failed to load city data for ${value}:`, error)\n }\n }\n finally {\n if (requestId === currentRequestId) {\n setLoading(false)\n }\n }\n }\n\n // 切換行政區\n function setArea(value: string) {\n setAreaState(value)\n const currentCityData = cityData()\n if (currentCityData) {\n const areaDataObj = currentCityData[value]\n if (areaDataObj) {\n const newRoads = Object.keys(areaDataObj)\n setRoads(newRoads)\n setRoadState(newRoads[0] ?? '')\n }\n else {\n setRoads([])\n setRoadState('')\n }\n }\n setNumber(undefined)\n setLane(undefined)\n setAlley(undefined)\n }\n\n // 切換路名\n function setRoad(value: string) {\n setRoadState(value)\n setNumber(undefined)\n setLane(undefined)\n setAlley(undefined)\n }\n\n // 路名搜尋\n function searchRoads(keyword: string) {\n if (!keyword.trim()) {\n setSearchResults([])\n return\n }\n\n const results: SearchResult[] = []\n const trimmed = keyword.trim()\n const currentCity = city()\n const currentCityData = cityData()\n\n if (currentCityData) {\n for (const [a, areaDataObj] of Object.entries(currentCityData)) {\n for (const r of Object.keys(areaDataObj)) {\n if (r.includes(trimmed)) {\n results.push({ city: currentCity, area: a, road: r })\n }\n }\n }\n }\n\n setSearchResults(results)\n }\n\n // 計算郵遞區號\n const result = createMemo<Zip6Result | undefined>(() => {\n if (!city() || !area() || !road() || !cityData()) return undefined\n return calculateZipCode(city(), area(), road(), number(), lane(), alley(), cityData(), zip3Map())\n })\n\n const zipCode = createMemo(() => result()?.zipcode ?? '')\n const zip3 = createMemo(() => result()?.zip3 ?? '')\n\n return {\n loading,\n cities,\n areas,\n roads,\n\n city,\n area,\n road,\n number,\n lane,\n alley,\n\n setCity,\n setArea,\n setRoad,\n setNumber,\n setLane,\n setAlley,\n\n searchRoads,\n searchResults,\n\n zipCode,\n zip3,\n result,\n\n preloadCities: (citiesToPreload: string[]) => preloadCities(citiesToPreload, { baseUrl }),\n isCityCached,\n clearCache,\n }\n}\n\nexport { clearCache, isCityCached } from '../zip6/loader'\nexport default useTwZip6\n"]}