UNPKG

@simoko/tw-zip

Version:

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

3 lines 3.87 kB
'use strict';var vue=require('vue');var k="https://cdn.jsdelivr.net/npm/@simoko/tw-zip/data/zip6",Z=new Map,U=null,O=null;async function L(a={}){if(U)return U;if(O)return O;let n=a.baseUrl||k;return O=fetch(`${n}/cities.json`).then(e=>{if(!e.ok)throw new Error(`Failed to load cities data: HTTP ${e.status}`);return e.json()}).then(e=>(U=e,e)).catch(e=>{throw O=null,e}),O}async function I(a,n={}){let e=a.trim();if(!e)throw new Error("City name cannot be empty");let i=Z.get(e);if(i)return i;let o=n.baseUrl||k,d=await fetch(`${o}/${encodeURIComponent(e)}.json`);if(!d.ok)throw new Error(`Failed to load city data for ${e}: HTTP ${d.status}`);let u=await d.json();return Z.set(e,u),u}async function P(a,n={}){await Promise.all(a.map(e=>I(e,n)));}function N(a){return Z.has(a)}function F(){Z.clear(),U=null,O=null;}var $=new Map;function S(a){if(!a)return [];let n=$.get(a);if(n)return n;let e=a.split("|").map(i=>{let o=i.split(",");return [o[0],...o.slice(1).map(Number)]});return $.set(a,e),e}function B(a,n,e,i,o,d,u,C){if(!u)return;let l=u[n];if(!l)return;let m=l[e];if(!m)return;let f=C[a]?.[n];if(!f)return;let g=S(m);for(let w of g){let[D,y=0,r=0,x=0,R=0,z=0,j=0,T=0,h=0,M=0]=w;if(r>0||x>0){if(!o)continue;if(r>0&&x>0){if(o<r||o>x)continue}else if(r>0){if(h===9999||h===9998){if(o<r)continue}else if(o!==r)continue}}if(R>0||z>0){if(!d)continue;if(R>0&&z>0){if(d<R||d>z)continue}else if(R>0&&d!==R)continue}if(i!==void 0&&(j>0||h>0)){if(y===1&&i%2===0||y===2&&i%2===1)continue;let t=h===9999||h===9998?Number.POSITIVE_INFINITY:h;if(j>0&&i<j||t!==Number.POSITIVE_INFINITY&&i>t)continue}else if(y!==0&&i!==void 0&&(y===1&&i%2===0||y===2&&i%2===1))continue;return {zipcode:f+D,zip3:f,city:a,area:n,road:e}}if(g.length>0){let[w]=g[0];return {zipcode:f+w,zip3:f,city:a,area:n,road:e}}}function q(a={}){let{baseUrl:n,preload:e}=a,i=vue.ref(true),o=vue.ref([]),d=vue.ref({}),u=vue.ref(""),C=vue.ref(""),l=vue.ref(""),m=vue.ref(void 0),f=vue.ref(void 0),g=vue.ref(void 0),w=vue.ref([]),D=vue.ref([]),y=vue.ref([]),r=vue.ref(void 0);async function x(t){let p=t;u.value=t,i.value=true;try{let s=await I(t,{baseUrl:n});if(u.value!==p)return;r.value=s;let v=Object.keys(s);if(w.value=v,C.value=v[0]??"",D.value=[],l.value="",m.value=void 0,f.value=void 0,g.value=void 0,v[0]){let A=s[v[0]];if(A){let b=Object.keys(A);D.value=b,l.value=b[0]??"";}}}catch(s){console.error(`Failed to load city data for ${t}:`,s);}finally{i.value=false;}}function R(t){if(C.value=t,r.value){let p=r.value[t];if(p){let s=Object.keys(p);D.value=s,l.value=s[0]??"";}else D.value=[],l.value="";}m.value=void 0,f.value=void 0,g.value=void 0;}function z(t){l.value=t,m.value=void 0,f.value=void 0,g.value=void 0;}function j(t){if(!t.trim()){y.value=[];return}let p=[],s=t.trim();if(r.value)for(let[v,A]of Object.entries(r.value))for(let b of Object.keys(A))b.includes(s)&&p.push({city:u.value,area:v,road:b});y.value=p;}let T=vue.computed(()=>{if(!(!u.value||!C.value||!l.value||!r.value))return B(u.value,C.value,l.value,m.value,f.value,g.value,r.value,d.value)}),h=vue.computed(()=>T.value?.zipcode??""),M=vue.computed(()=>T.value?.zip3??"");return vue.onMounted(async()=>{i.value=true;try{let t=await L({baseUrl:n});o.value=t.cities,d.value=t.zip3;let p=t.cities[0]??"";if(u.value=p,e&&e.length>0&&await P(e,{baseUrl:n}),p){let s=await I(p,{baseUrl:n});r.value=s;let v=Object.keys(s);if(w.value=v,C.value=v[0]??"",v[0]){let A=s[v[0]];if(A){let b=Object.keys(A);D.value=b,l.value=b[0]??"";}}}}catch(t){console.error("Failed to initialize tw-zip data:",t);}finally{i.value=false;}}),{loading:i,cities:o,areas:w,roads:D,city:u,area:C,road:l,number:m,lane:f,alley:g,setCity:x,setArea:R,setRoad:z,searchRoads:j,searchResults:y,zipCode:h,zip3:M,result:T,preloadCities:t=>P(t,{baseUrl:n}),isCityCached:N,clearCache:F}} exports.useTwZip6=q;//# sourceMappingURL=lazy.cjs.map //# sourceMappingURL=lazy.cjs.map