@cp949/japanpost-react 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,9 @@
1
1
  import { ComponentPropsWithoutRef, ReactNode } from 'react';
2
+ /**
3
+ * `japanpost-react`의 공개 계약과 내부 정규화 계약을 한 곳에 모아 둔 타입 모음이다.
4
+ * 훅, 입력 컴포넌트, data source, minimal-api 연동 예제가 모두 이 정의를 기준으로 맞물리므로
5
+ * 필드 의미를 바꿀 때는 런타임 동작뿐 아니라 외부 사용자의 기대 계약도 함께 고려해야 한다.
6
+ */
2
7
  /**
3
8
  * 일본우정 API에서 반환되는 원본 주소 레코드 형태.
4
9
  * 공개 API 표면에는 직접 노출하지 않고 내부에서만 사용한다.
@@ -33,6 +38,39 @@ export type JapanPostAddressZipResponse = {
33
38
  status?: number;
34
39
  };
35
40
  export type JapanPostApiResponse = JapanPostSearchCodeResponse | JapanPostAddressZipResponse;
41
+ /**
42
+ * minimal-api가 그대로 받는 공개 searchcode 요청 타입이다.
43
+ * pageNumber/rowsPerPage를 노출하는 이유는 라이브러리와 API 예제가 같은 pager 의미 체계를 공유하기 위해서다.
44
+ */
45
+ export type JapanPostSearchcodeRequest = {
46
+ value: string;
47
+ pageNumber: number;
48
+ rowsPerPage: number;
49
+ includeParenthesesTown?: boolean | null;
50
+ };
51
+ /**
52
+ * minimal-api가 그대로 받는 공개 addresszip 요청 타입이다.
53
+ * 자유 검색(freeword)뿐 아니라 구조화 검색 필드도 함께 열어 두어
54
+ * 상위 UI가 필요한 만큼만 업스트림 검색 축을 선택적으로 노출할 수 있게 한다.
55
+ */
56
+ export type JapanPostAddresszipRequest = {
57
+ freeword?: string | null;
58
+ prefCode?: string | null;
59
+ prefName?: string | null;
60
+ prefKana?: string | null;
61
+ prefRoma?: string | null;
62
+ cityCode?: string | null;
63
+ cityName?: string | null;
64
+ cityKana?: string | null;
65
+ cityRoma?: string | null;
66
+ townName?: string | null;
67
+ townKana?: string | null;
68
+ townRoma?: string | null;
69
+ pageNumber: number;
70
+ rowsPerPage: number;
71
+ includeCityDetails?: boolean | null;
72
+ includePrefectureDetails?: boolean | null;
73
+ };
36
74
  /**
37
75
  * API 응답을 정규화한 후의 중간 주소 레코드 형태.
38
76
  * 내부 data source 처리 후 공개 JapanAddress 타입으로 변환되기 전에 사용된다.
@@ -49,6 +87,7 @@ export type NormalizedJapanAddressRecord = {
49
87
  };
50
88
  /**
51
89
  * 라이브러리 공개 주소 타입. 훅과 클라이언트가 외부로 반환하는 최종 형태.
90
+ * `address`는 표시 편의를 위한 결합 문자열이고, 나머지 필드는 후처리/재조합이 가능한 구조화 값이다.
52
91
  */
53
92
  export type JapanAddress = {
54
93
  postalCode: string;
@@ -62,25 +101,33 @@ export type JapanAddress = {
62
101
  provider: "japan-post";
63
102
  };
64
103
  /**
65
- * 우편번호 조회 결과. 하나의 우편번호에 여러 주소가 대응될 수 있다.
104
+ * minimal-api와 라이브러리가 공통으로 사용하는 pager 응답 계약이다.
105
+ * 페이지 기반 UI가 아니더라도 total/page 정보를 유지해 "결과 없음"과 "일부만 조회됨"을 구분할 수 있다.
66
106
  */
67
- export type JapanPostalCodeLookupResult = {
68
- postalCode: string;
69
- addresses: JapanAddress[];
107
+ export type Page<T> = {
108
+ elements: T[];
109
+ totalElements: number;
110
+ pageNumber: number;
111
+ rowsPerPage: number;
70
112
  };
113
+ /**
114
+ * 우편번호 조회 결과.
115
+ * 단일 주소만 기대하는 소비자도 있을 수 있지만, 업스트림 계약이 목록 + 페이징이므로 그대로 보존한다.
116
+ */
117
+ export type JapanPostalCodeLookupResult = Page<JapanAddress>;
71
118
  /**
72
119
  * 키워드 주소 검색 결과.
120
+ * postal code 조회와 동일한 pager 형태를 사용해 두 검색 모드를 같은 UI로 렌더링할 수 있게 한다.
73
121
  */
74
- export type JapanAddressSearchResult = {
75
- query: string;
76
- addresses: JapanAddress[];
77
- };
122
+ export type JapanAddressSearchResult = Page<JapanAddress>;
78
123
  /**
79
124
  * 라이브러리 전용 오류 코드 목록.
125
+ * 소비자는 message 문자열보다 code를 기준으로 UX를 분기하는 것이 안전하다.
80
126
  */
81
127
  export type JapanAddressErrorCode = "invalid_postal_code" | "invalid_query" | "network_error" | "timeout" | "not_found" | "bad_response" | "data_source_error";
82
128
  /**
83
129
  * 라이브러리 전용 에러 타입. 훅과 data source 전반에서 일관되게 사용된다.
130
+ * 브라우저/서버/사용자 입력 오류를 모두 같은 형태로 감싸 public contract를 단순화한다.
84
131
  */
85
132
  export type JapanAddressError = Error & {
86
133
  name: "JapanAddressError";
@@ -90,6 +137,7 @@ export type JapanAddressError = Error & {
90
137
  };
91
138
  /**
92
139
  * data source 요청에 전달할 선택 옵션.
140
+ * 현재는 AbortSignal만 쓰지만, 추후 timeout/metadata가 필요해져도 호출부 시그니처를 크게 흔들지 않기 위한 확장 지점이다.
93
141
  */
94
142
  export type JapanAddressRequestOptions = {
95
143
  signal?: AbortSignal;
@@ -97,26 +145,30 @@ export type JapanAddressRequestOptions = {
97
145
  /**
98
146
  * 주소 데이터를 제공하는 data source 인터페이스.
99
147
  * 커스텀 구현체로 교체할 수 있도록 추상화되어 있다.
148
+ * 즉, 훅은 fetch 구현을 모르고 pager 계약과 에러 계약만 신뢰한다.
100
149
  */
101
150
  export type JapanAddressDataSource = {
102
- lookupPostalCode: (postalCode: string, options?: JapanAddressRequestOptions) => Promise<JapanAddress[]>;
103
- searchAddress: (query: string, options?: JapanAddressRequestOptions) => Promise<JapanAddress[]>;
151
+ lookupPostalCode: (request: JapanPostSearchcodeRequest, options?: JapanAddressRequestOptions) => Promise<Page<JapanAddress>>;
152
+ searchAddress: (request: JapanPostAddresszipRequest, options?: JapanAddressRequestOptions) => Promise<Page<JapanAddress>>;
104
153
  };
105
154
  /**
106
- * useJapanPostalCode 훅 옵션
155
+ * useJapanPostalCode 훅 옵션.
156
+ * data source 주입 방식으로 브라우저 직접 호출, BFF, mock을 모두 같은 훅으로 다룬다.
107
157
  */
108
158
  export type UseJapanPostalCodeOptions = {
109
159
  dataSource: JapanAddressDataSource;
110
160
  };
111
161
  /**
112
- * useJapanAddressSearch 훅 옵션
162
+ * useJapanAddressSearch 훅 옵션.
163
+ * debounce는 UI 입력 빈도를 제어하기 위한 것이며 data source 계약을 바꾸지 않는다.
113
164
  */
114
165
  export type UseJapanAddressSearchOptions = {
115
166
  dataSource: JapanAddressDataSource;
116
167
  debounceMs?: number;
117
168
  };
118
169
  /**
119
- * useJapanAddress 훅 옵션
170
+ * useJapanAddress 훅 옵션.
171
+ * 통합 훅도 내부적으로는 두 검색 훅을 조합하므로 필요한 옵션만 얇게 위임한다.
120
172
  */
121
173
  export type UseJapanAddressOptions = {
122
174
  dataSource: JapanAddressDataSource;
@@ -124,6 +176,7 @@ export type UseJapanAddressOptions = {
124
176
  };
125
177
  /**
126
178
  * 비동기 데이터 로딩 상태를 표현하는 제네릭 타입.
179
+ * 모든 훅이 같은 상태 모양을 공유하면 소비자 컴포넌트가 검색 종류와 무관하게 공통 렌더링 로직을 가질 수 있다.
127
180
  */
128
181
  export type UseAsyncState<T> = {
129
182
  loading: boolean;
@@ -131,29 +184,33 @@ export type UseAsyncState<T> = {
131
184
  error: JapanAddressError | null;
132
185
  };
133
186
  /**
134
- * useJapanPostalCode 훅의 반환 타입
187
+ * useJapanPostalCode 훅의 반환 타입.
188
+ * search는 실패나 취소 시 null을 반환해 UI가 try/catch 없이도 분기할 수 있게 한다.
135
189
  */
136
190
  export type UseJapanPostalCodeResult = UseAsyncState<JapanPostalCodeLookupResult> & {
137
191
  reset: () => void;
138
192
  search: (value: string) => Promise<JapanPostalCodeLookupResult | null>;
139
193
  };
140
194
  /**
141
- * useJapanAddressSearch 훅의 반환 타입
195
+ * useJapanAddressSearch 훅의 반환 타입.
196
+ * debounce 취소와 오류 모두 Promise 결과 관점에서는 null로 귀결될 수 있으므로 호출부는 state와 함께 해석해야 한다.
142
197
  */
143
198
  export type UseJapanAddressSearchResult = UseAsyncState<JapanAddressSearchResult> & {
144
199
  reset: () => void;
145
200
  search: (query: string) => Promise<JapanAddressSearchResult | null>;
146
201
  };
147
202
  /**
148
- * useJapanAddress 훅의 반환 타입 (우편번호·키워드 통합)
203
+ * useJapanAddress 훅의 반환 타입.
204
+ * data/error는 "현재 활성 검색 모드" 기준 값이며, 두 내부 훅의 상태 전체를 그대로 노출하지는 않는다.
149
205
  */
150
- export type UseJapanAddressResult = UseAsyncState<JapanPostalCodeLookupResult | JapanAddressSearchResult> & {
206
+ export type UseJapanAddressResult = UseAsyncState<Page<JapanAddress>> & {
151
207
  reset: () => void;
152
208
  searchByPostalCode: (value: string) => Promise<JapanPostalCodeLookupResult | null>;
153
209
  searchByKeyword: (query: string) => Promise<JapanAddressSearchResult | null>;
154
210
  };
155
211
  /**
156
- * 검색 입력 컴포넌트들이 공유하는 공통 props
212
+ * 검색 입력 컴포넌트들이 공유하는 공통 props.
213
+ * 제어/비제어 모드를 모두 지원해 폼 라이브러리와 단순 데모 예제를 같은 컴포넌트로 소화한다.
157
214
  */
158
215
  type BaseTextSearchInputProps = {
159
216
  defaultValue?: string;
@@ -165,14 +222,16 @@ type BaseTextSearchInputProps = {
165
222
  buttonProps?: Omit<ComponentPropsWithoutRef<"button">, "children" | "disabled" | "onClick" | "type">;
166
223
  };
167
224
  /**
168
- * PostalCodeInput 컴포넌트 props
225
+ * PostalCodeInput 컴포넌트 props.
226
+ * onSearch는 표시 문자열이 아니라 정규화된 우편번호를 받는다는 점이 핵심 계약이다.
169
227
  */
170
228
  export type PostalCodeInputProps = BaseTextSearchInputProps & {
171
229
  onChange?: (postalCode: string) => void;
172
230
  onSearch: (postalCode: string) => void;
173
231
  };
174
232
  /**
175
- * AddressSearchInput 컴포넌트 props
233
+ * AddressSearchInput 컴포넌트 props.
234
+ * onSearch에는 trim 처리된 검색어가 전달되어 공백만 다른 입력이 별도 쿼리로 취급되지 않게 한다.
176
235
  */
177
236
  export type AddressSearchInputProps = BaseTextSearchInputProps & {
178
237
  onChange?: (query: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export { PostalCodeInput } from './components/PostalCodeInput';
3
3
  export { createJapanAddressError } from './core/errors';
4
4
  export { formatJapanPostalCode, normalizeJapanPostalCode, } from './core/formatters';
5
5
  export { normalizeJapanPostAddressRecord } from './core/normalizers';
6
- export type { AddressSearchInputProps, JapanAddress, JapanAddressDataSource, JapanAddressError, JapanAddressErrorCode, JapanAddressRequestOptions, JapanAddressSearchResult, JapanPostalCodeLookupResult, NormalizedJapanAddressRecord, PostalCodeInputProps, UseJapanAddressOptions, UseJapanAddressResult, UseJapanAddressSearchOptions, UseJapanAddressSearchResult, UseJapanPostalCodeOptions, UseJapanPostalCodeResult, } from './core/types';
6
+ export type { AddressSearchInputProps, JapanAddress, JapanAddressDataSource, JapanAddressError, JapanAddressErrorCode, JapanPostAddresszipRequest, JapanPostSearchcodeRequest, JapanAddressRequestOptions, JapanAddressSearchResult, JapanPostalCodeLookupResult, NormalizedJapanAddressRecord, Page, PostalCodeInputProps, UseJapanAddressOptions, UseJapanAddressResult, UseJapanAddressSearchOptions, UseJapanAddressSearchResult, UseJapanPostalCodeOptions, UseJapanPostalCodeResult, } from './core/types';
7
7
  export { isValidJapanPostalCode } from './core/validators';
8
8
  export { useJapanAddress } from './react/useJapanAddress';
9
9
  export { useJapanAddressSearch } from './react/useJapanAddressSearch';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAG/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAGxD,OAAO,EACL,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AAGrE,YAAY,EACV,uBAAuB,EACvB,YAAY,EACZ,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,2BAA2B,EAC3B,4BAA4B,EAC5B,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,4BAA4B,EAC5B,2BAA2B,EAC3B,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAG/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAGxD,OAAO,EACL,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AAGrE,YAAY,EACV,uBAAuB,EACvB,YAAY,EACZ,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACrB,0BAA0B,EAC1B,0BAA0B,EAC1B,0BAA0B,EAC1B,wBAAwB,EACxB,2BAA2B,EAC3B,4BAA4B,EAC5B,IAAI,EACJ,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,4BAA4B,EAC5B,2BAA2B,EAC3B,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC"}
package/dist/index.es.js CHANGED
@@ -330,10 +330,11 @@ function x(i) {
330
330
  let r = n.trim();
331
331
  if (!r) throw m("invalid_query", "Address query is required");
332
332
  let i = { signal: t }, o = {
333
- query: r,
334
- addresses: await a.searchAddress(r, i)
335
- };
336
- return p(e, o), o;
333
+ freeword: r,
334
+ pageNumber: 0,
335
+ rowsPerPage: 100
336
+ }, s = await a.searchAddress(o, i);
337
+ return p(e, s), s;
337
338
  } catch (t) {
338
339
  return h(e, v(t));
339
340
  } finally {
@@ -386,12 +387,13 @@ function C(t) {
386
387
  let { requestId: t, signal: n } = s();
387
388
  try {
388
389
  let i = d(e);
389
- if (!/^\d{7}$/.test(i)) throw m("invalid_postal_code", "Postal code must contain exactly 7 digits");
390
+ if (!/^\d{3,7}$/.test(i)) throw m("invalid_postal_code", "Postal code must contain between 3 and 7 digits");
390
391
  let a = { signal: n }, o = {
391
- postalCode: i,
392
- addresses: await r.lookupPostalCode(i, a)
393
- };
394
- return c(t, o), o;
392
+ value: i,
393
+ pageNumber: 0,
394
+ rowsPerPage: 100
395
+ }, s = await r.lookupPostalCode(o, a);
396
+ return c(t, s), s;
395
397
  } catch (e) {
396
398
  return l(t, v(e));
397
399
  } finally {
@@ -3,4 +3,4 @@
3
3
  <%s {...props} />
4
4
  React keys must be passed directly to JSX without using spread:
5
5
  let props = %s;
6
- <%s key={someKey} {...props} />`,o,p,m,p),L[p+o]=!0)}if(p=null,i!==void 0&&(r(i),p=``+i),s(n)&&(r(n.key),p=``+n.key),`key`in n)for(var h in i={},n)h!==`key`&&(i[h]=n[h]);else i=n;return p&&c(i,typeof e==`function`?e.displayName||e.name||`Unknown`:e),u(e,p,i,a(),l,d)}function f(e){p(e)?e._store&&(e._store.validated=1):typeof e==`object`&&e&&e.$$typeof===E&&(e._payload.status===`fulfilled`?p(e._payload.value)&&e._payload.value._store&&(e._payload.value._store.validated=1):e._store&&(e._store.validated=1))}function p(e){return typeof e==`object`&&!!e&&e.$$typeof===h}var m=require(`react`),h=Symbol.for(`react.transitional.element`),g=Symbol.for(`react.portal`),_=Symbol.for(`react.fragment`),v=Symbol.for(`react.strict_mode`),y=Symbol.for(`react.profiler`),b=Symbol.for(`react.consumer`),x=Symbol.for(`react.context`),S=Symbol.for(`react.forward_ref`),C=Symbol.for(`react.suspense`),w=Symbol.for(`react.suspense_list`),T=Symbol.for(`react.memo`),E=Symbol.for(`react.lazy`),D=Symbol.for(`react.activity`),O=Symbol.for(`react.client.reference`),k=m.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,A=Object.prototype.hasOwnProperty,j=Array.isArray,M=console.createTask?console.createTask:function(){return null};m={react_stack_bottom_frame:function(e){return e()}};var N,P={},F=m.react_stack_bottom_frame.bind(m,o)(),I=M(i(o)),L={};e.Fragment=_,e.jsx=function(e,t,n){var r=1e4>k.recentlyCreatedOwnerStacks++;return d(e,t,n,!1,r?Error(`react-stack-top-frame`):F,r?M(i(e)):I)},e.jsxs=function(e,t,n){var r=1e4>k.recentlyCreatedOwnerStacks++;return d(e,t,n,!0,r?Error(`react-stack-top-frame`):F,r?M(i(e)):I)}})()})),a=n(((e,t)=>{process.env.NODE_ENV===`production`?t.exports=r():t.exports=i()}))();function o({defaultValue:e=``,value:n,disabled:r,label:i=`Address keyword`,buttonLabel:o=`Search`,inputProps:s,buttonProps:c,onChange:l,onSearch:u}){let[d,f]=(0,t.useState)(e),p=n??d;function m(e){e.preventDefault(),u(p.trim())}function h(e){n===void 0&&f(e),l?.(e)}return(0,a.jsxs)(`form`,{onSubmit:m,children:[(0,a.jsxs)(`label`,{children:[i,(0,a.jsx)(`input`,{...s,disabled:r,value:p,onChange:e=>h(e.target.value)})]}),(0,a.jsx)(`button`,{...c,disabled:r,type:`submit`,children:o})]})}function s(e){return e.replace(/[^\d]/g,``)}function c(e){let t=s(e);return t.length===7?`${t.slice(0,3)}-${t.slice(3)}`:t}function l({defaultValue:e=``,value:n,disabled:r,label:i=`Postal code`,buttonLabel:o=`Search`,inputProps:c,buttonProps:l,onChange:u,onSearch:d}){let[f,p]=(0,t.useState)(e),m=n??f;function h(e){e.preventDefault(),d(s(m))}function g(e){n===void 0&&p(e),u?.(e)}return(0,a.jsxs)(`form`,{onSubmit:h,children:[(0,a.jsxs)(`label`,{children:[i,(0,a.jsx)(`input`,{...c,disabled:r,inputMode:c?.inputMode??`numeric`,value:m,onChange:e=>g(e.target.value)})]}),(0,a.jsx)(`button`,{...l,disabled:r,type:`submit`,children:o})]})}function u(e,t,n){let r=Error(t);return r.name=`JapanAddressError`,r.code=e,r.cause=n?.cause,r.status=n?.status,r}function d(e){return e.filter(Boolean).join(` `).trim()}function f(e){let t=d([e.prefecture,e.city,e.town,e.detail??``]);return{postalCode:e.postalCode,prefecture:e.prefecture,prefectureKana:e.prefectureKana,city:e.city,cityKana:e.cityKana,town:e.town,townKana:e.townKana,address:t,provider:`japan-post`}}function p(e){return/^\d{7}$/.test(s(e))}function m(e){return typeof e==`object`&&e&&`code`in e&&typeof e.code==`string`?e:u(`data_source_error`,e instanceof Error?e.message:`Unknown error`,{cause:e})}function h(){let e=(0,t.useRef)(0),n=(0,t.useRef)(!0),r=(0,t.useRef)(null),[i,a]=(0,t.useState)(!1),[o,s]=(0,t.useState)(null),[c,l]=(0,t.useState)(null),u=(0,t.useCallback)(t=>n.current&&t===e.current,[]),d=(0,t.useCallback)(()=>{e.current+=1,r.current?.abort(),r.current=null},[]);return(0,t.useEffect)(()=>(n.current=!0,()=>{n.current=!1,d()}),[d]),{loading:i,data:o,error:c,beginRequest:(0,t.useCallback)(()=>{let t=e.current+1;e.current=t,r.current?.abort();let n=new AbortController;return r.current=n,a(!0),l(null),{requestId:t,signal:n.signal}},[]),setSuccess:(0,t.useCallback)((e,t)=>{u(e)&&s(t)},[u]),setFailure:(0,t.useCallback)((e,t)=>(u(e)&&(l(t),s(null)),null),[u]),finishRequest:(0,t.useCallback)(e=>{u(e)&&(a(!1),r.current=null)},[u]),reset:(0,t.useCallback)(()=>{d(),a(!1),s(null),l(null)},[d])}}function g(e){if(e)return e;throw Error(`useJapanAddressSearch requires options.dataSource`)}function _(e){let n=(0,t.useMemo)(()=>g(e.dataSource),[e.dataSource]),r=e.debounceMs??0,i=(0,t.useRef)(null),a=(0,t.useRef)(null),{loading:o,data:s,error:c,beginRequest:l,setSuccess:d,setFailure:f,finishRequest:p,reset:_}=h(),v=(0,t.useCallback)(e=>{i.current!==null&&(globalThis.clearTimeout(i.current),i.current=null),a.current?.(e),a.current=null},[]);(0,t.useEffect)(()=>()=>{v(null)},[v]);let y=(0,t.useCallback)(()=>{v(null),_()},[v,_]),b=(0,t.useCallback)(async(e,t,r)=>{try{let i=r.trim();if(!i)throw u(`invalid_query`,`Address query is required`);let a={signal:t},o={query:i,addresses:await n.searchAddress(i,a)};return d(e,o),o}catch(t){return f(e,m(t))}finally{p(e)}},[n,p,f,d]);return{loading:o,data:s,error:c,reset:y,search:(0,t.useCallback)(e=>{let{requestId:t,signal:n}=l();return v(null),r<=0?b(t,n,e):new Promise(o=>{a.current=o,i.current=globalThis.setTimeout(()=>{i.current=null;let r=a.current;a.current=null,b(t,n,e).then(e=>{r?.(e)})},r)})},[l,v,r,b])}}function v(e){if(e)return e;throw Error(`useJapanPostalCode requires options.dataSource`)}function y(e){let n=(0,t.useMemo)(()=>v(e.dataSource),[e.dataSource]),{loading:r,data:i,error:a,beginRequest:o,setSuccess:c,setFailure:l,finishRequest:d,reset:f}=h();return{loading:r,data:i,error:a,reset:f,search:(0,t.useCallback)(async e=>{let{requestId:t,signal:r}=o();try{let i=s(e);if(!/^\d{7}$/.test(i))throw u(`invalid_postal_code`,`Postal code must contain exactly 7 digits`);let a={signal:r},o={postalCode:i,addresses:await n.lookupPostalCode(i,a)};return c(t,o),o}catch(e){return l(t,m(e))}finally{d(t)}},[o,n,d,l,c])}}function b(e){let n=(0,t.useMemo)(()=>{if(e.dataSource)return e.dataSource;throw Error(`useJapanAddress requires options.dataSource`)},[e.dataSource]),r=y({dataSource:n}),i=_({dataSource:n,debounceMs:e.debounceMs}),a=r.reset,o=r.search,s=i.reset,c=i.search,[l,u]=(0,t.useState)(null),d=(0,t.useCallback)(async e=>(s(),u(`postalCode`),o(e)),[s,o]),f=(0,t.useCallback)(async e=>(a(),u(`keyword`),c(e)),[a,c]),p=(0,t.useCallback)(()=>{a(),s(),u(null)},[s,a]),m=l===`postalCode`?r.data:l===`keyword`?i.data:null,h=l===`postalCode`?r.error:l===`keyword`?i.error:null;return{loading:r.loading||i.loading,data:m,error:h,reset:p,searchByPostalCode:d,searchByKeyword:f}}e.AddressSearchInput=o,e.PostalCodeInput=l,e.createJapanAddressError=u,e.formatJapanPostalCode=c,e.isValidJapanPostalCode=p,e.normalizeJapanPostAddressRecord=f,e.normalizeJapanPostalCode=s,e.useJapanAddress=b,e.useJapanAddressSearch=_,e.useJapanPostalCode=y});
6
+ <%s key={someKey} {...props} />`,o,p,m,p),L[p+o]=!0)}if(p=null,i!==void 0&&(r(i),p=``+i),s(n)&&(r(n.key),p=``+n.key),`key`in n)for(var h in i={},n)h!==`key`&&(i[h]=n[h]);else i=n;return p&&c(i,typeof e==`function`?e.displayName||e.name||`Unknown`:e),u(e,p,i,a(),l,d)}function f(e){p(e)?e._store&&(e._store.validated=1):typeof e==`object`&&e&&e.$$typeof===E&&(e._payload.status===`fulfilled`?p(e._payload.value)&&e._payload.value._store&&(e._payload.value._store.validated=1):e._store&&(e._store.validated=1))}function p(e){return typeof e==`object`&&!!e&&e.$$typeof===h}var m=require(`react`),h=Symbol.for(`react.transitional.element`),g=Symbol.for(`react.portal`),_=Symbol.for(`react.fragment`),v=Symbol.for(`react.strict_mode`),y=Symbol.for(`react.profiler`),b=Symbol.for(`react.consumer`),x=Symbol.for(`react.context`),S=Symbol.for(`react.forward_ref`),C=Symbol.for(`react.suspense`),w=Symbol.for(`react.suspense_list`),T=Symbol.for(`react.memo`),E=Symbol.for(`react.lazy`),D=Symbol.for(`react.activity`),O=Symbol.for(`react.client.reference`),k=m.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,A=Object.prototype.hasOwnProperty,j=Array.isArray,M=console.createTask?console.createTask:function(){return null};m={react_stack_bottom_frame:function(e){return e()}};var N,P={},F=m.react_stack_bottom_frame.bind(m,o)(),I=M(i(o)),L={};e.Fragment=_,e.jsx=function(e,t,n){var r=1e4>k.recentlyCreatedOwnerStacks++;return d(e,t,n,!1,r?Error(`react-stack-top-frame`):F,r?M(i(e)):I)},e.jsxs=function(e,t,n){var r=1e4>k.recentlyCreatedOwnerStacks++;return d(e,t,n,!0,r?Error(`react-stack-top-frame`):F,r?M(i(e)):I)}})()})),a=n(((e,t)=>{process.env.NODE_ENV===`production`?t.exports=r():t.exports=i()}))();function o({defaultValue:e=``,value:n,disabled:r,label:i=`Address keyword`,buttonLabel:o=`Search`,inputProps:s,buttonProps:c,onChange:l,onSearch:u}){let[d,f]=(0,t.useState)(e),p=n??d;function m(e){e.preventDefault(),u(p.trim())}function h(e){n===void 0&&f(e),l?.(e)}return(0,a.jsxs)(`form`,{onSubmit:m,children:[(0,a.jsxs)(`label`,{children:[i,(0,a.jsx)(`input`,{...s,disabled:r,value:p,onChange:e=>h(e.target.value)})]}),(0,a.jsx)(`button`,{...c,disabled:r,type:`submit`,children:o})]})}function s(e){return e.replace(/[^\d]/g,``)}function c(e){let t=s(e);return t.length===7?`${t.slice(0,3)}-${t.slice(3)}`:t}function l({defaultValue:e=``,value:n,disabled:r,label:i=`Postal code`,buttonLabel:o=`Search`,inputProps:c,buttonProps:l,onChange:u,onSearch:d}){let[f,p]=(0,t.useState)(e),m=n??f;function h(e){e.preventDefault(),d(s(m))}function g(e){n===void 0&&p(e),u?.(e)}return(0,a.jsxs)(`form`,{onSubmit:h,children:[(0,a.jsxs)(`label`,{children:[i,(0,a.jsx)(`input`,{...c,disabled:r,inputMode:c?.inputMode??`numeric`,value:m,onChange:e=>g(e.target.value)})]}),(0,a.jsx)(`button`,{...l,disabled:r,type:`submit`,children:o})]})}function u(e,t,n){let r=Error(t);return r.name=`JapanAddressError`,r.code=e,r.cause=n?.cause,r.status=n?.status,r}function d(e){return e.filter(Boolean).join(` `).trim()}function f(e){let t=d([e.prefecture,e.city,e.town,e.detail??``]);return{postalCode:e.postalCode,prefecture:e.prefecture,prefectureKana:e.prefectureKana,city:e.city,cityKana:e.cityKana,town:e.town,townKana:e.townKana,address:t,provider:`japan-post`}}function p(e){return/^\d{7}$/.test(s(e))}function m(e){return typeof e==`object`&&e&&`code`in e&&typeof e.code==`string`?e:u(`data_source_error`,e instanceof Error?e.message:`Unknown error`,{cause:e})}function h(){let e=(0,t.useRef)(0),n=(0,t.useRef)(!0),r=(0,t.useRef)(null),[i,a]=(0,t.useState)(!1),[o,s]=(0,t.useState)(null),[c,l]=(0,t.useState)(null),u=(0,t.useCallback)(t=>n.current&&t===e.current,[]),d=(0,t.useCallback)(()=>{e.current+=1,r.current?.abort(),r.current=null},[]);return(0,t.useEffect)(()=>(n.current=!0,()=>{n.current=!1,d()}),[d]),{loading:i,data:o,error:c,beginRequest:(0,t.useCallback)(()=>{let t=e.current+1;e.current=t,r.current?.abort();let n=new AbortController;return r.current=n,a(!0),l(null),{requestId:t,signal:n.signal}},[]),setSuccess:(0,t.useCallback)((e,t)=>{u(e)&&s(t)},[u]),setFailure:(0,t.useCallback)((e,t)=>(u(e)&&(l(t),s(null)),null),[u]),finishRequest:(0,t.useCallback)(e=>{u(e)&&(a(!1),r.current=null)},[u]),reset:(0,t.useCallback)(()=>{d(),a(!1),s(null),l(null)},[d])}}function g(e){if(e)return e;throw Error(`useJapanAddressSearch requires options.dataSource`)}function _(e){let n=(0,t.useMemo)(()=>g(e.dataSource),[e.dataSource]),r=e.debounceMs??0,i=(0,t.useRef)(null),a=(0,t.useRef)(null),{loading:o,data:s,error:c,beginRequest:l,setSuccess:d,setFailure:f,finishRequest:p,reset:_}=h(),v=(0,t.useCallback)(e=>{i.current!==null&&(globalThis.clearTimeout(i.current),i.current=null),a.current?.(e),a.current=null},[]);(0,t.useEffect)(()=>()=>{v(null)},[v]);let y=(0,t.useCallback)(()=>{v(null),_()},[v,_]),b=(0,t.useCallback)(async(e,t,r)=>{try{let i=r.trim();if(!i)throw u(`invalid_query`,`Address query is required`);let a={signal:t},o={freeword:i,pageNumber:0,rowsPerPage:100},s=await n.searchAddress(o,a);return d(e,s),s}catch(t){return f(e,m(t))}finally{p(e)}},[n,p,f,d]);return{loading:o,data:s,error:c,reset:y,search:(0,t.useCallback)(e=>{let{requestId:t,signal:n}=l();return v(null),r<=0?b(t,n,e):new Promise(o=>{a.current=o,i.current=globalThis.setTimeout(()=>{i.current=null;let r=a.current;a.current=null,b(t,n,e).then(e=>{r?.(e)})},r)})},[l,v,r,b])}}function v(e){if(e)return e;throw Error(`useJapanPostalCode requires options.dataSource`)}function y(e){let n=(0,t.useMemo)(()=>v(e.dataSource),[e.dataSource]),{loading:r,data:i,error:a,beginRequest:o,setSuccess:c,setFailure:l,finishRequest:d,reset:f}=h();return{loading:r,data:i,error:a,reset:f,search:(0,t.useCallback)(async e=>{let{requestId:t,signal:r}=o();try{let i=s(e);if(!/^\d{3,7}$/.test(i))throw u(`invalid_postal_code`,`Postal code must contain between 3 and 7 digits`);let a={signal:r},o={value:i,pageNumber:0,rowsPerPage:100},l=await n.lookupPostalCode(o,a);return c(t,l),l}catch(e){return l(t,m(e))}finally{d(t)}},[o,n,d,l,c])}}function b(e){let n=(0,t.useMemo)(()=>{if(e.dataSource)return e.dataSource;throw Error(`useJapanAddress requires options.dataSource`)},[e.dataSource]),r=y({dataSource:n}),i=_({dataSource:n,debounceMs:e.debounceMs}),a=r.reset,o=r.search,s=i.reset,c=i.search,[l,u]=(0,t.useState)(null),d=(0,t.useCallback)(async e=>(s(),u(`postalCode`),o(e)),[s,o]),f=(0,t.useCallback)(async e=>(a(),u(`keyword`),c(e)),[a,c]),p=(0,t.useCallback)(()=>{a(),s(),u(null)},[s,a]),m=l===`postalCode`?r.data:l===`keyword`?i.data:null,h=l===`postalCode`?r.error:l===`keyword`?i.error:null;return{loading:r.loading||i.loading,data:m,error:h,reset:p,searchByPostalCode:d,searchByKeyword:f}}e.AddressSearchInput=o,e.PostalCodeInput=l,e.createJapanAddressError=u,e.formatJapanPostalCode=c,e.isValidJapanPostalCode=p,e.normalizeJapanPostAddressRecord=f,e.normalizeJapanPostalCode=s,e.useJapanAddress=b,e.useJapanAddressSearch=_,e.useJapanPostalCode=y});
@@ -1,7 +1,8 @@
1
1
  import { JapanAddressError } from '../core/types';
2
2
  /**
3
3
  * 알 수 없는 에러를 JapanAddressError로 변환한다.
4
- * 이미 JapanAddressError(code 필드를 가진 객체)이면 그대로 반환한다.
4
+ * data source 구현이 라이브러리 전용 에러를 직접 던질 수도 있고 일반 Error를 던질 수도 있으므로,
5
+ * 훅 바깥으로는 항상 같은 오류 계약만 보이게 맞춘다.
5
6
  */
6
7
  export declare function toJapanAddressError(error: unknown): JapanAddressError;
7
8
  //# sourceMappingURL=toJapanAddressError.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"toJapanAddressError.d.ts","sourceRoot":"","sources":["../../src/react/toJapanAddressError.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CAiBrE"}
1
+ {"version":3,"file":"toJapanAddressError.d.ts","sourceRoot":"","sources":["../../src/react/toJapanAddressError.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CAiBrE"}
@@ -1,7 +1,8 @@
1
1
  import { UseJapanAddressOptions, UseJapanAddressResult } from '../core/types';
2
2
  /**
3
3
  * 우편번호 조회와 키워드 주소 검색을 하나의 인터페이스로 제공하는 통합 훅.
4
- * 두 검색 모드가 공유하는 data source를 내부에서 재사용한다.
4
+ * 두 검색 모드가 공유하는 data source를 내부에서 재사용하고,
5
+ * 마지막으로 실행된 검색 종류만 외부에 노출해 두 결과가 섞이지 않도록 한다.
5
6
  */
6
7
  export declare function useJapanAddress(options: UseJapanAddressOptions): UseJapanAddressResult;
7
8
  //# sourceMappingURL=useJapanAddress.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useJapanAddress.d.ts","sourceRoot":"","sources":["../../src/react/useJapanAddress.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,eAAe,CAAC;AAIvB;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,sBAAsB,GAC9B,qBAAqB,CA6EvB"}
1
+ {"version":3,"file":"useJapanAddress.d.ts","sourceRoot":"","sources":["../../src/react/useJapanAddress.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,eAAe,CAAC;AAIvB;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,sBAAsB,GAC9B,qBAAqB,CA+EvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"useJapanAddressSearch.d.ts","sourceRoot":"","sources":["../../src/react/useJapanAddressSearch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAIV,4BAA4B,EAC5B,2BAA2B,EAC5B,MAAM,eAAe,CAAC;AAYvB;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,2BAA2B,CAwI7B"}
1
+ {"version":3,"file":"useJapanAddressSearch.d.ts","sourceRoot":"","sources":["../../src/react/useJapanAddressSearch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAIV,4BAA4B,EAC5B,2BAA2B,EAC5B,MAAM,eAAe,CAAC;AAgBvB;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,2BAA2B,CA6I7B"}
@@ -1 +1 @@
1
- {"version":3,"file":"useJapanPostalCode.d.ts","sourceRoot":"","sources":["../../src/react/useJapanPostalCode.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAIV,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,eAAe,CAAC;AAYvB;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,GACjC,wBAAwB,CA2D1B"}
1
+ {"version":3,"file":"useJapanPostalCode.d.ts","sourceRoot":"","sources":["../../src/react/useJapanPostalCode.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAIV,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,eAAe,CAAC;AAgBvB;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,GACjC,wBAAwB,CAmE1B"}
@@ -1,4 +1,9 @@
1
1
  import { JapanAddressError } from '../core/types';
2
+ /**
3
+ * 개별 검색 훅에서 공통으로 사용하는 "최신 요청 우선(last request wins)" 상태 관리 훅이다.
4
+ * 같은 훅 인스턴스 안에서 요청이 겹치면 가장 마지막 요청만 성공/실패 상태를 반영하고,
5
+ * 이전 요청은 AbortSignal과 requestId 비교를 함께 사용해 조용히 무효화한다.
6
+ */
2
7
  type BeginRequestResult = {
3
8
  requestId: number;
4
9
  signal: AbortSignal;
@@ -1 +1 @@
1
- {"version":3,"file":"useLatestRequestState.d.ts","sourceRoot":"","sources":["../../src/react/useLatestRequestState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,KAAK,kBAAkB,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,OAAO;;;;wBA4BN,kBAAkB;4BAiBZ,MAAM,UAAU,OAAO;4BAOpD,MAAM,aAAa,iBAAiB;+BAWJ,MAAM;;EAwBrD"}
1
+ {"version":3,"file":"useLatestRequestState.d.ts","sourceRoot":"","sources":["../../src/react/useLatestRequestState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD;;;;GAIG;AACH,KAAK,kBAAkB,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,OAAO;;;;wBAgCN,kBAAkB;4BAqBZ,MAAM,UAAU,OAAO;4BAOpD,MAAM,aAAa,iBAAiB;+BAaJ,MAAM;;EA0BrD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cp949/japanpost-react",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Headless React hooks and optional components for Japan Post postcode and address search",
5
5
  "type": "module",
6
6
  "author": "cp949",
@@ -71,7 +71,7 @@
71
71
  "check-types": "tsc --noEmit",
72
72
  "test": "pnpm test:unit",
73
73
  "test:artifacts": "pnpm build && vitest run tests/packageArtifacts.test.ts",
74
- "test:unit": "vitest run",
74
+ "test:unit": "vitest run --exclude tests/packageArtifacts.test.ts",
75
75
  "test:watch": "vitest"
76
76
  }
77
77
  }