@simoko/tw-zip
Version:
台灣縣市、行政區、郵遞區號(3碼/6碼)查詢工具,支援 React/Vue/Svelte/SolidJS/Angular
1 lines • 26.2 kB
Source Map (JSON)
{"version":3,"sources":["../../src/angular/lazy.ts","../../src/zip6/loader.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","_noEnd1","maxNo","_TwZip6LazyService_decorators","_init","Injectable","TwZip6LazyService","signal","computed","c","a","r","firstCity","firstCityData","newAreas","newRoads","value","currentRequestId","newCityData","keyword","results","trimmed","currentCity","citiesToPreload","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"+CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,MAAA,CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,cAAA,CAAA,IAAA,CAAA,CAAA,MAAA,CAAA,wBAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,MAAA,CAAA,GAAA,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,MAAA,SAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,IAAA,CAAA,YAAA,CAAA,IAAA,CAAA,QAAA,CAAA,IAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,YAAA,CAAA,IAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,UAAA,CAAA,OAAA,CAAA,OAAA,CAAA,KAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,GAAA,MAAA,EAAA,OAAA,CAAA,EAAA,UAAA,CAAA,CAAA,CAAA,mBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,QAAA,CAAA,CAAA,CAAA,cAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,qBAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,IAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,IAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,EAAA,CAAA,C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","file":"lazy.cjs","sourcesContent":["import { computed, Injectable, signal } from '@angular/core'\nimport type { CityAreaData, Zip3Map } from '../zip6/loader'\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 TwZip6LazyServiceOptions {\n /** 資料來源 URL(預設使用 jsDelivr CDN) */\n baseUrl?: string\n /** 預載入的縣市列表 */\n preload?: string[]\n}\n\n// 規則解析快取\nconst parsedRulesCache = new Map<string, Array<[string, ...number[]]>>()\n\n// 解析規則字串(帶快取)\nfunction parseRules(rulesStr: string): Array<[string, ...number[]]> {\n if (!rulesStr)\n return []\n\n const cached = parsedRulesCache.get(rulesStr)\n if (cached)\n 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\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)\n return undefined\n\n const areaData = cityData[area]\n if (!areaData)\n return undefined\n\n const rulesStr = areaData[road]\n if (!rulesStr)\n return undefined\n\n const zip3 = zip3Map[city]?.[area]\n if (!zip3)\n 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, _noEnd1 = 0] = rule\n\n // 檢查巷\n if (rLane > 0 || rLane1 > 0) {\n if (!lane)\n continue\n if (rLane > 0 && rLane1 > 0) {\n if (lane < rLane || lane > rLane1)\n continue\n }\n else if (rLane > 0) {\n if (noEnd === 9999 || noEnd === 9998) {\n if (lane < rLane)\n continue\n }\n else if (lane !== rLane) {\n continue\n }\n }\n }\n\n // 檢查弄\n if (rAlley > 0 || rAlley1 > 0) {\n if (!alley)\n continue\n if (rAlley > 0 && rAlley1 > 0) {\n if (alley < rAlley || alley > rAlley1)\n continue\n }\n else if (rAlley > 0 && alley !== rAlley) {\n continue\n }\n }\n\n // 檢查門牌號碼\n if (number !== undefined && (noBgn > 0 || noEnd > 0)) {\n if (even === 1 && number % 2 === 0)\n continue\n if (even === 2 && number % 2 === 1)\n continue\n\n const maxNo = noEnd === 9999 || noEnd === 9998 ? Number.POSITIVE_INFINITY : noEnd\n if (noBgn > 0 && number < noBgn)\n continue\n if (maxNo !== Number.POSITIVE_INFINITY && number > maxNo)\n continue\n }\n else if (even !== 0 && number !== undefined) {\n if (even === 1 && number % 2 === 0)\n continue\n if (even === 2 && number % 2 === 1)\n continue\n }\n\n return { zipcode: zip3 + suffix, zip3, city, area, road }\n }\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\n@Injectable({\n providedIn: 'root',\n})\nexport class TwZip6LazyService {\n private readonly baseUrl = signal<string | undefined>(undefined)\n private readonly zip3Map = signal<Zip3Map>({})\n private readonly cityData = signal<CityAreaData | undefined>(undefined)\n private requestId = 0\n\n // 狀態\n readonly loading = signal(true)\n readonly cities = signal<string[]>([])\n\n // 選中值\n readonly city = signal('')\n readonly area = signal('')\n readonly road = signal('')\n readonly number = signal<number | undefined>(undefined)\n readonly lane = signal<number | undefined>(undefined)\n readonly alley = signal<number | undefined>(undefined)\n\n // 選項列表\n readonly areas = signal<string[]>([])\n readonly roads = signal<string[]>([])\n readonly searchResults = signal<SearchResult[]>([])\n\n // 計算結果\n readonly result = computed<Zip6Result | undefined>(() => {\n const c = this.city()\n const a = this.area()\n const r = this.road()\n const data = this.cityData()\n if (!c || !a || !r || !data)\n return undefined\n return calculateZipCode(c, a, r, this.number(), this.lane(), this.alley(), data, this.zip3Map())\n })\n\n readonly zipCode = computed(() => this.result()?.zipcode ?? '')\n readonly zip3 = computed(() => this.result()?.zip3 ?? '')\n\n /**\n * 初始化服務(必須在使用前呼叫)\n */\n async init(options: TwZip6LazyServiceOptions = {}): Promise<void> {\n this.baseUrl.set(options.baseUrl)\n this.loading.set(true)\n\n try {\n const data = await loadCitiesData({ baseUrl: options.baseUrl })\n this.cities.set(data.cities)\n this.zip3Map.set(data.zip3)\n\n const firstCity = data.cities[0] ?? ''\n this.city.set(firstCity)\n\n // 預載入指定縣市\n if (options.preload && options.preload.length > 0) {\n await preloadCities(options.preload, { baseUrl: options.baseUrl })\n }\n\n // 載入第一個縣市的資料\n if (firstCity) {\n const firstCityData = await loadCityData(firstCity, { baseUrl: options.baseUrl })\n this.cityData.set(firstCityData)\n const newAreas = Object.keys(firstCityData)\n this.areas.set(newAreas)\n this.area.set(newAreas[0] ?? '')\n\n if (newAreas[0]) {\n const areaData = firstCityData[newAreas[0]]\n if (areaData) {\n const newRoads = Object.keys(areaData)\n this.roads.set(newRoads)\n this.road.set(newRoads[0] ?? '')\n }\n }\n }\n }\n finally {\n this.loading.set(false)\n }\n }\n\n /**\n * 設定縣市(會觸發非同步載入)\n */\n async setCity(value: string): Promise<void> {\n const currentRequestId = ++this.requestId\n this.city.set(value)\n this.loading.set(true)\n\n try {\n const newCityData = await loadCityData(value, { baseUrl: this.baseUrl() })\n\n // 檢查競態條件\n if (this.requestId !== currentRequestId) {\n return\n }\n\n this.cityData.set(newCityData)\n const newAreas = Object.keys(newCityData)\n this.areas.set(newAreas)\n this.area.set(newAreas[0] ?? '')\n this.roads.set([])\n this.road.set('')\n this.number.set(undefined)\n this.lane.set(undefined)\n this.alley.set(undefined)\n\n if (newAreas[0]) {\n const areaData = newCityData[newAreas[0]]\n if (areaData) {\n const newRoads = Object.keys(areaData)\n this.roads.set(newRoads)\n this.road.set(newRoads[0] ?? '')\n }\n }\n }\n catch (error) {\n if (this.requestId === currentRequestId) {\n console.error(`Failed to load city data for ${value}:`, error)\n }\n }\n finally {\n if (this.requestId === currentRequestId) {\n this.loading.set(false)\n }\n }\n }\n\n /**\n * 設定行政區\n */\n setArea(value: string): void {\n this.area.set(value)\n const data = this.cityData()\n if (data) {\n const areaData = data[value]\n if (areaData) {\n const newRoads = Object.keys(areaData)\n this.roads.set(newRoads)\n this.road.set(newRoads[0] ?? '')\n }\n else {\n this.roads.set([])\n this.road.set('')\n }\n }\n this.number.set(undefined)\n this.lane.set(undefined)\n this.alley.set(undefined)\n }\n\n /**\n * 設定路名\n */\n setRoad(value: string): void {\n this.road.set(value)\n this.number.set(undefined)\n this.lane.set(undefined)\n this.alley.set(undefined)\n }\n\n /**\n * 設定門牌號碼\n */\n setNumber(value: number | undefined): void {\n this.number.set(value)\n }\n\n /**\n * 設定巷\n */\n setLane(value: number | undefined): void {\n this.lane.set(value)\n }\n\n /**\n * 設定弄\n */\n setAlley(value: number | undefined): void {\n this.alley.set(value)\n }\n\n /**\n * 搜尋路名(在目前縣市中搜尋)\n */\n searchRoads(keyword: string): void {\n if (!keyword.trim()) {\n this.searchResults.set([])\n return\n }\n\n const results: SearchResult[] = []\n const trimmed = keyword.trim()\n const data = this.cityData()\n const currentCity = this.city()\n\n if (data) {\n for (const [a, areaData] of Object.entries(data)) {\n for (const r of Object.keys(areaData)) {\n if (r.includes(trimmed)) {\n results.push({ city: currentCity, area: a, road: r })\n }\n }\n }\n }\n\n this.searchResults.set(results)\n }\n\n /**\n * 預載入縣市資料\n */\n async preloadCities(citiesToPreload: string[]): Promise<void> {\n await preloadCities(citiesToPreload, { baseUrl: this.baseUrl() })\n }\n\n /**\n * 檢查縣市是否已快取\n */\n isCityCached(city: string): boolean {\n return isCityCached(city)\n }\n\n /**\n * 清除快取\n */\n clearCache(): void {\n clearCache()\n }\n}\n\n// Re-export loader utilities for convenience\nexport { clearCache, isCityCached, preloadCities } from '../zip6/loader'\n","/**\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"]}