@cp949/japanpost-react 1.0.1 → 1.0.3

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.
Files changed (49) hide show
  1. package/README.ko.md +89 -23
  2. package/README.md +231 -191
  3. package/dist/client.d.ts +1 -0
  4. package/dist/client.es.js +3 -0
  5. package/dist/index.d.ts +1 -11
  6. package/dist/index.es.js +156 -290
  7. package/dist/src/client.d.ts +7 -0
  8. package/dist/src/client.d.ts.map +1 -0
  9. package/dist/src/components/AddressSearchInput.d.ts.map +1 -0
  10. package/dist/src/components/PostalCodeInput.d.ts.map +1 -0
  11. package/dist/src/core/errors.d.ts.map +1 -0
  12. package/dist/src/core/formatters.d.ts.map +1 -0
  13. package/dist/src/core/normalizers.d.ts.map +1 -0
  14. package/dist/{core → src/core}/types.d.ts +27 -7
  15. package/dist/src/core/types.d.ts.map +1 -0
  16. package/dist/src/core/validators.d.ts.map +1 -0
  17. package/dist/src/index.d.ts +11 -0
  18. package/dist/src/index.d.ts.map +1 -0
  19. package/dist/src/react/toJapanAddressError.d.ts.map +1 -0
  20. package/dist/src/react/useJapanAddress.d.ts.map +1 -0
  21. package/dist/src/react/useJapanAddressSearch.d.ts.map +1 -0
  22. package/dist/src/react/useJapanPostalCode.d.ts.map +1 -0
  23. package/dist/{react → src/react}/useLatestRequestState.d.ts +1 -0
  24. package/dist/src/react/useLatestRequestState.d.ts.map +1 -0
  25. package/package.json +11 -8
  26. package/dist/components/AddressSearchInput.d.ts.map +0 -1
  27. package/dist/components/PostalCodeInput.d.ts.map +0 -1
  28. package/dist/core/errors.d.ts.map +0 -1
  29. package/dist/core/formatters.d.ts.map +0 -1
  30. package/dist/core/normalizers.d.ts.map +0 -1
  31. package/dist/core/types.d.ts.map +0 -1
  32. package/dist/core/validators.d.ts.map +0 -1
  33. package/dist/index.d.ts.map +0 -1
  34. package/dist/index.umd.cjs +0 -6
  35. package/dist/react/toJapanAddressError.d.ts.map +0 -1
  36. package/dist/react/useJapanAddress.d.ts.map +0 -1
  37. package/dist/react/useJapanAddressSearch.d.ts.map +0 -1
  38. package/dist/react/useJapanPostalCode.d.ts.map +0 -1
  39. package/dist/react/useLatestRequestState.d.ts.map +0 -1
  40. /package/dist/{components → src/components}/AddressSearchInput.d.ts +0 -0
  41. /package/dist/{components → src/components}/PostalCodeInput.d.ts +0 -0
  42. /package/dist/{core → src/core}/errors.d.ts +0 -0
  43. /package/dist/{core → src/core}/formatters.d.ts +0 -0
  44. /package/dist/{core → src/core}/normalizers.d.ts +0 -0
  45. /package/dist/{core → src/core}/validators.d.ts +0 -0
  46. /package/dist/{react → src/react}/toJapanAddressError.d.ts +0 -0
  47. /package/dist/{react → src/react}/useJapanAddress.d.ts +0 -0
  48. /package/dist/{react → src/react}/useJapanAddressSearch.d.ts +0 -0
  49. /package/dist/{react → src/react}/useJapanPostalCode.d.ts +0 -0
package/README.ko.md CHANGED
@@ -18,6 +18,28 @@ pnpm add @cp949/japanpost-react
18
18
 
19
19
  - 지원 React 버전: React 18, React 19
20
20
 
21
+ 이 패키지는 ESM으로 배포됩니다. 서버 유틸리티와 공용 타입은
22
+ `@cp949/japanpost-react`에서 가져오고, Next.js App Router에서 훅이나
23
+ headless 입력 컴포넌트는 `@cp949/japanpost-react/client`를 사용하세요.
24
+ `require("@cp949/japanpost-react")`,
25
+ `require("@cp949/japanpost-react/client")`는 지원되지 않으며, CommonJS
26
+ 소비자는 `const pkg = await import("@cp949/japanpost-react");` 같은 ESM
27
+ interop을 사용해야 합니다.
28
+
29
+ ## Next.js
30
+
31
+ Next.js App Router에서 훅이나 headless 입력 컴포넌트를 쓸 때는
32
+ 클라이언트 컴포넌트 안에서 `@cp949/japanpost-react/client` 경로를
33
+ 사용하는 것을 권장합니다. 유틸리티 함수와 공용 타입은 루트 엔트리에서
34
+ 가져오면 됩니다.
35
+
36
+ ```tsx
37
+ "use client";
38
+
39
+ import { PostalCodeInput, useJapanPostalCode } from "@cp949/japanpost-react/client";
40
+ import { normalizeJapanPostalCode, type JapanAddressDataSource } from "@cp949/japanpost-react";
41
+ ```
42
+
21
43
  ## 빠른 시작
22
44
 
23
45
  ```tsx
@@ -157,6 +179,9 @@ export function PostalForm() {
157
179
  성공할 수 있고, `404 -> not_found`는 miss를 오류로 노출하는 백엔드에서만
158
180
  선택적으로 쓰면 됩니다.
159
181
 
182
+ Next.js에서도 `dataSource`는 자체 서버 API를 바라보도록 두고, Japan Post
183
+ 업스트림 자격 증명과 토큰 교환은 브라우저가 아니라 서버에서 처리하세요.
184
+
160
185
  ## Exports
161
186
 
162
187
  - `normalizeJapanPostalCode`
@@ -169,8 +194,10 @@ export function PostalForm() {
169
194
  - `useJapanAddress`
170
195
  - `PostalCodeInput`
171
196
  - `AddressSearchInput`
172
- - `JapanAddress`, `JapanAddressDataSource`, `JapanPostSearchcodeRequest`,
173
- `JapanPostAddresszipRequest`, `Page`를 포함한 공개 타입
197
+ - `JapanAddress`, `JapanAddressDataSource`, `JapanPostalCodeSearchInput`,
198
+ `JapanAddressSearchInput`, `JapanPostSearchcodeRequest`,
199
+ `JapanPostAddresszipRequest`, `Page`를 포함한
200
+ 공개 타입
174
201
  - 요청 옵션 타입: `JapanAddressRequestOptions`
175
202
 
176
203
  ## 유틸리티 메모
@@ -182,56 +209,94 @@ export function PostalForm() {
182
209
 
183
210
  ### useJapanPostalCode
184
211
 
185
- 우편번호로 주소를 조회합니다. `3~7자리` 숫자 입력을 받아 `3~6자리`일 때는
186
- prefix 검색으로 동작합니다.
212
+ 우편번호로 주소를 조회합니다. 문자열 입력과 구조화된 요청 입력을 모두
213
+ 받을 수 있고, `3~6자리` 입력일 때는 prefix 검색으로 동작합니다.
187
214
 
188
215
  ```tsx
189
- const { loading, data, error, search, reset } = useJapanPostalCode({
216
+ const { loading, data, error, search, cancel, reset } = useJapanPostalCode({
190
217
  dataSource,
191
218
  });
192
219
  ```
193
220
 
221
+ ```tsx
222
+ void search("1000001");
223
+ void search({
224
+ postalCode: "1000001",
225
+ pageNumber: 1,
226
+ rowsPerPage: 10,
227
+ includeParenthesesTown: true,
228
+ });
229
+ ```
230
+
231
+ `cancel()`은 진행 중인 조회를 중단하고 현재 data/error 상태는 그대로 유지합니다.
232
+ `reset()`은 `cancel()`을 호출한 뒤 data/error까지 비워 훅을 idle 상태로
233
+ 되돌립니다.
234
+
194
235
  ### useJapanAddressSearch
195
236
 
196
- 자유 형식 키워드로 주소를 검색하며 `debounceMs`를 지원합니다.
237
+ 자유 형식 키워드 또는 구조화된 필드로 주소를 검색하며 `debounceMs`를 지원합니다.
197
238
 
198
239
  ```tsx
199
- const { loading, data, error, search, reset } = useJapanAddressSearch({
240
+ const { loading, data, error, search, cancel, reset } = useJapanAddressSearch({
200
241
  dataSource,
201
242
  debounceMs: 300,
202
243
  });
203
244
  ```
204
245
 
246
+ ```tsx
247
+ void search("Tokyo");
248
+ void search({
249
+ addressQuery: "Tokyo",
250
+ pageNumber: 1,
251
+ rowsPerPage: 10,
252
+ includeCityDetails: true,
253
+ });
254
+ void search({
255
+ prefName: "東京都",
256
+ cityName: "千代田区",
257
+ });
258
+ ```
259
+
260
+ `search("Tokyo")`는 `addressQuery` 검색의 축약형입니다. 구조화된 필드는
261
+ `addressQuery` 없이도 사용할 수 있어서, 도도부현/시/동 단위로만 검색하고 싶을 때
262
+ 유용합니다.
263
+
205
264
  이 훅은 빈 검색어에 대해 여전히 클라이언트 선제 검증을 수행하고, 요청을 보내기
206
265
  전에 `invalid_query`를 반환합니다. 이 검증은 UX 보조 장치이며 서버 검증이나
207
266
  서버 계약 처리를 대체하지 않습니다.
208
267
 
268
+ `cancel()`은 진행 중인 요청이나 대기 중인 debounce 타이머를 중단하고,
269
+ 현재 data/error 상태는 그대로 유지합니다. `reset()`은 `cancel()`을 호출한 뒤
270
+ data와 error까지 비워 훅을 idle 상태로 되돌립니다.
271
+
209
272
  ### useJapanAddress
210
273
 
211
- 우편번호 조회와 키워드 검색을 하나의 훅으로 합칩니다.
274
+ 우편번호 조회와 주소 질의 검색을 하나의 훅으로 합칩니다.
212
275
 
213
276
  ```tsx
214
- const { loading, data, error, searchByPostalCode, searchByKeyword, reset } =
277
+ const { loading, data, error, searchByPostalCode, searchByAddressQuery, reset } =
215
278
  useJapanAddress({ dataSource, debounceMs: 300 });
216
279
  ```
217
280
 
218
281
  모든 훅은 런타임에서 `dataSource`가 필요합니다.
219
282
 
220
- 훅의 public API는 계속 문자열 기반입니다.
283
+ `useJapanPostalCode().search`, `useJapanAddressSearch().search`,
284
+ `useJapanAddress`의 편의 메서드는 모두 같은 공개 검색 입력 타입을 받습니다.
221
285
 
222
- - `useJapanPostalCode().search(value: string)`
223
- - `useJapanAddressSearch().search(query: string)`
224
- - `useJapanAddress().searchByPostalCode(value: string)`
225
- - `useJapanAddress().searchByKeyword(query: string)`
286
+ - `useJapanPostalCode().search(input: JapanPostalCodeSearchInput)`
287
+ - `useJapanAddressSearch().search(input: JapanAddressSearchInput)`
288
+ - `useJapanAddress().searchByPostalCode(input: JapanPostalCodeSearchInput)`
289
+ - `useJapanAddress().searchByAddressQuery(input: JapanAddressSearchInput)`
226
290
 
227
291
  대신 훅 내부에서 `dataSource` 호출 전에 request object를 조립합니다.
228
292
 
229
- - 우편번호 조회: `{ value, pageNumber: 0, rowsPerPage: 100 }`
230
- - 주소 검색: `{ freeword, pageNumber: 0, rowsPerPage: 100 }`
293
+ - 우편번호 조회: `{ postalCode, pageNumber: 0, rowsPerPage: 100 }`
294
+ - 주소 검색: `{ addressQuery, pageNumber: 0, rowsPerPage: 100 }`
231
295
 
232
- `includeCityDetails`, `includePrefectureDetails` 같은 optional flag는
233
- 기본적으로 넣지 않으며, 필요하면 사용자 data source 구현에서 직접
234
- 지정하면 됩니다.
296
+ `useJapanAddressSearch`에서는 `addressQuery`를 생략한 구조화 요청도 가능하므로
297
+ 도도부현, 시, 필드만으로 검색할 있습니다. `includeCityDetails`,
298
+ `includePrefectureDetails` 같은 optional flag는 기본적으로 넣지 않으며,
299
+ 필요하면 사용자 data source 구현에서 직접 지정하면 됩니다.
235
300
 
236
301
  ## 에러 처리 메모
237
302
 
@@ -248,9 +313,9 @@ type JapanAddressRequestOptions = {
248
313
  };
249
314
  ```
250
315
 
251
- 훅은 superseded 요청, `reset()`, unmount 정리 상황에서 이전 요청을 취소할 수
252
- 있도록 `signal`을 전달합니다. 백엔드 레이어가 abort를 지원하면 그대로 활용할 수
253
- 있습니다.
316
+ 훅은 superseded 요청, `cancel()`, `reset()`, unmount 정리 상황에서 이전
317
+ 요청을 취소할 수 있도록 `signal`을 전달합니다. 백엔드 레이어가 abort를 지원하면
318
+ 그대로 활용할 수 있습니다.
254
319
 
255
320
  권장 에러 코드 매핑:
256
321
 
@@ -305,5 +370,6 @@ timeout 메시지는 토큰 발급 단계와 실제 조회 단계 중 어느 쪽
305
370
  ## SSR
306
371
 
307
372
  `dataSource` 구현에서는 서버 측 API를 사용하고, 토큰 교환과 업스트림 서명은
308
- 서버에서만 처리하세요. React 훅과 UI 컴포넌트는 클라이언트 컴포넌트에서
373
+ 서버에서만 처리하세요. Next.js App Router에서는 React 훅과 UI 컴포넌트를
374
+ `@cp949/japanpost-react/client`에서 import해 클라이언트 컴포넌트에서
309
375
  사용하는 것이 안전합니다.