@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.
- package/README.ko.md +309 -0
- package/README.md +148 -334
- package/dist/components/AddressSearchInput.d.ts +1 -0
- package/dist/components/AddressSearchInput.d.ts.map +1 -1
- package/dist/components/PostalCodeInput.d.ts +1 -0
- package/dist/components/PostalCodeInput.d.ts.map +1 -1
- package/dist/core/errors.d.ts +3 -2
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/normalizers.d.ts +1 -1
- package/dist/core/normalizers.d.ts.map +1 -1
- package/dist/core/types.d.ts +79 -20
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +11 -9
- package/dist/index.umd.cjs +1 -1
- package/dist/react/toJapanAddressError.d.ts +2 -1
- package/dist/react/toJapanAddressError.d.ts.map +1 -1
- package/dist/react/useJapanAddress.d.ts +2 -1
- package/dist/react/useJapanAddress.d.ts.map +1 -1
- package/dist/react/useJapanAddressSearch.d.ts.map +1 -1
- package/dist/react/useJapanPostalCode.d.ts.map +1 -1
- package/dist/react/useLatestRequestState.d.ts +5 -0
- package/dist/react/useLatestRequestState.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/core/types.d.ts
CHANGED
|
@@ -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
|
|
68
|
-
|
|
69
|
-
|
|
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: (
|
|
103
|
-
searchAddress: (
|
|
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<
|
|
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;
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEjE;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GAAG;IAItC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAKlC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAKnC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAK1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAK1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAK1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAK1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAK1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAK1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAK3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAM3B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,2BAA2B,GAAG;IAIxC,SAAS,CAAC,EAAE,yBAAyB,EAAE,GAAG,IAAI,CAAC;IAK/C,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAKxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,2BAA2B,GAAG;IAIxC,SAAS,CAAC,EAAE,yBAAyB,EAAE,GAAG,IAAI,CAAC;IAK/C,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAKxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAGF,MAAM,MAAM,oBAAoB,GAC5B,2BAA2B,GAC3B,2BAA2B,CAAC;AAEhC;;;GAGG;AACH,MAAM,MAAM,4BAA4B,GAAG;IAIzC,UAAU,EAAE,MAAM,CAAC;IAKnB,UAAU,EAAE,MAAM,CAAC;IAKnB,cAAc,CAAC,EAAE,MAAM,CAAC;IAKxB,IAAI,EAAE,MAAM,CAAC;IAKb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAKlB,IAAI,EAAE,MAAM,CAAC;IAKb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAKlB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF
|
|
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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
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
|
|
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
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
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 {
|
package/dist/index.umd.cjs
CHANGED
|
@@ -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={
|
|
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
|
-
*
|
|
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
|
|
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
|
|
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;
|
|
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;
|
|
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;;;;
|
|
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.
|
|
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
|
}
|