@sayren/store-sdk 0.33.0 → 0.35.0
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/dist/index.d.mts +1205 -681
- package/dist/index.mjs +292 -27
- package/package.json +1 -1
- package/src/client.ts +91 -5
- package/src/http.ts +1 -1
- package/src/index.ts +3 -0
- package/src/schemas/category.ts +25 -0
- package/src/schemas/locale.ts +39 -0
- package/src/schemas/market.ts +24 -0
- package/src/schemas/order.ts +9 -2
- package/src/schemas/payment.ts +2 -2
- package/src/schemas/points.ts +2 -5
- package/src/schemas/product-info.ts +190 -0
- package/src/schemas/product-localization.ts +76 -0
- package/src/schemas/product.ts +41 -2
- package/src/schemas/store.ts +11 -0
- package/src/schemas/storefront-hosting.ts +6 -10
package/src/schemas/product.ts
CHANGED
|
@@ -14,6 +14,13 @@ import {
|
|
|
14
14
|
productFulfillmentUpdateSchema,
|
|
15
15
|
} from "./fulfillment";
|
|
16
16
|
import { pointEarnRateBpSchema } from "./points";
|
|
17
|
+
import {
|
|
18
|
+
MAX_PRODUCT_INFO_SECTIONS,
|
|
19
|
+
productCertificationsRequestSchema,
|
|
20
|
+
productCertificationsSchema,
|
|
21
|
+
productNoticeRequestSchema,
|
|
22
|
+
productNoticeSchema,
|
|
23
|
+
} from "./product-info";
|
|
17
24
|
import { productRefundPolicyPatchSchema } from "./refund-policy";
|
|
18
25
|
import { inventoryModeSchema } from "./stay";
|
|
19
26
|
import { UPLOAD_PURPOSE_LIMITS, uploadExtensionOf } from "./upload";
|
|
@@ -445,6 +452,19 @@ export const productSchema = productSummarySchema.extend({
|
|
|
445
452
|
.describe(
|
|
446
453
|
"설정된 즉시할인. GET /v1/products/{productId}/discount 응답과 같은 형태다. 할인이 없으면 null",
|
|
447
454
|
),
|
|
455
|
+
notice: productNoticeSchema
|
|
456
|
+
.nullable()
|
|
457
|
+
.optional()
|
|
458
|
+
.describe("상품정보제공 고시(이슈 #135). 없으면 null. 서버는 항상 싣는다"),
|
|
459
|
+
certifications: productCertificationsSchema
|
|
460
|
+
.nullable()
|
|
461
|
+
.optional()
|
|
462
|
+
.describe("인증 정보(이슈 #135). 없으면 null. 서버는 항상 싣는다"),
|
|
463
|
+
infoSectionIds: z
|
|
464
|
+
.array(z.string())
|
|
465
|
+
.optional()
|
|
466
|
+
.default([])
|
|
467
|
+
.describe("연결한 안내 섹션 id(이슈 #135). 배열 순서가 표시 순서다. 서버는 항상 싣는다"),
|
|
448
468
|
createdAt: z.string().optional(),
|
|
449
469
|
});
|
|
450
470
|
|
|
@@ -569,14 +589,14 @@ export const optionModelRequestSchema = z.object({
|
|
|
569
589
|
.max(MAX_ADDON_GROUPS)
|
|
570
590
|
.optional()
|
|
571
591
|
.describe(
|
|
572
|
-
"추가 선택 옵션명 전체(이슈 #59). 주면 통째로 바꾸고, 생략하면 등록은 없음·수정은 현재 값을 그대로 둔다. 끄려면 빈 배열을
|
|
592
|
+
"추가 선택 옵션명 전체(이슈 #59). 주면 통째로 바꾸고, 생략하면 등록은 없음·수정은 현재 값을 그대로 둔다. 끄려면 빈 배열을 보낸다",
|
|
573
593
|
),
|
|
574
594
|
customInputs: z
|
|
575
595
|
.array(customInputRequestSchema)
|
|
576
596
|
.max(MAX_CUSTOM_INPUTS)
|
|
577
597
|
.optional()
|
|
578
598
|
.describe(
|
|
579
|
-
"직접 입력 항목 전체(이슈 #59). 배열 순서가 표시 순서다. 주면 통째로 바꾸고, 생략하면 등록은 없음·수정은 현재 값을 그대로 둔다. 항목명에 개인정보성 단어(`CUSTOM_INPUT_FORBIDDEN_WORDS`)가 있으면 400 `CUSTOM_INPUT_LABEL_FORBIDDEN
|
|
599
|
+
"직접 입력 항목 전체(이슈 #59). 배열 순서가 표시 순서다. 주면 통째로 바꾸고, 생략하면 등록은 없음·수정은 현재 값을 그대로 둔다. 항목명에 개인정보성 단어(`CUSTOM_INPUT_FORBIDDEN_WORDS`)가 있으면 400 `CUSTOM_INPUT_LABEL_FORBIDDEN`이다",
|
|
580
600
|
),
|
|
581
601
|
optionSort: optionSortSchema
|
|
582
602
|
.optional()
|
|
@@ -694,6 +714,25 @@ const productWriteShape = {
|
|
|
694
714
|
"상품별 환불 정책 — 준 항목만 상점 기본을 덮어쓴다. `null`이나 생략은 상점 기본을 그대로 쓴다는 뜻이다. " +
|
|
695
715
|
"반품·교환 배송비(`returnDeliveryFee`·`exchangeDeliveryFee`)는 배송 상품에만 줄 수 있다(다른 유형은 400)",
|
|
696
716
|
),
|
|
717
|
+
notice: productNoticeRequestSchema
|
|
718
|
+
.nullable()
|
|
719
|
+
.optional()
|
|
720
|
+
.describe(
|
|
721
|
+
"상품정보제공 고시(이슈 #135). `null`은 지운다. 등록에서 생략하면 없음, 전체 수정(PUT)에서 생략하면 지금 값을 유지한다",
|
|
722
|
+
),
|
|
723
|
+
certifications: productCertificationsRequestSchema
|
|
724
|
+
.nullable()
|
|
725
|
+
.optional()
|
|
726
|
+
.describe(
|
|
727
|
+
"인증 정보(이슈 #135). `null`은 지운다. 등록에서 생략하면 없음, 전체 수정(PUT)에서 생략하면 지금 값을 유지한다",
|
|
728
|
+
),
|
|
729
|
+
infoSectionIds: z
|
|
730
|
+
.array(z.string().min(1))
|
|
731
|
+
.max(MAX_PRODUCT_INFO_SECTIONS)
|
|
732
|
+
.optional()
|
|
733
|
+
.describe(
|
|
734
|
+
"연결할 안내 섹션 id(이슈 #135). 배열 순서가 표시 순서다. 이 상점의 섹션이 아니면 400 `INFO_SECTION_NOT_FOUND`. 전체 수정(PUT)에서 생략하면 지금 연결을 유지한다",
|
|
735
|
+
),
|
|
697
736
|
...optionModelRequestSchema.shape,
|
|
698
737
|
sourceOptionSetIds: z
|
|
699
738
|
.array(z.string())
|
package/src/schemas/store.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { storeRoleSchema } from "./auth";
|
|
3
|
+
import { localeCodeSchema } from "./locale";
|
|
3
4
|
import { refundPolicyPatchSchema, refundPolicySchema } from "./refund-policy";
|
|
4
5
|
import { shippingPolicyPatchSchema, shippingPolicySchema } from "./shipping-policy";
|
|
5
6
|
|
|
@@ -307,6 +308,11 @@ export const updateStoreRequestSchema = z
|
|
|
307
308
|
privacyUrl: policyDocumentUrlSchema
|
|
308
309
|
.optional()
|
|
309
310
|
.describe("개인정보 수집이용 동의 문서 주소(https). `null`을 주면 지운다"),
|
|
311
|
+
defaultLocale: localeCodeSchema
|
|
312
|
+
.optional()
|
|
313
|
+
.describe(
|
|
314
|
+
"상점 기본 언어(이슈 #134). 상품·카테고리 필드가 이 언어 값이고 번역이 없는 칸은 이 값으로 보인다. 바꿔도 저장된 값은 그대로다",
|
|
315
|
+
),
|
|
310
316
|
})
|
|
311
317
|
.refine((value) => Object.values(value).some((v) => v !== undefined), {
|
|
312
318
|
message: "최소 1개 필드가 필요합니다",
|
|
@@ -358,6 +364,11 @@ export const storeSchema = z.object({
|
|
|
358
364
|
.describe("이용약관 문서 주소. 정하지 않았으면 null이고 동의 이력에도 주소가 남지 않는다"),
|
|
359
365
|
privacyUrl: z.string().nullable().describe("개인정보 수집이용 동의 문서 주소"),
|
|
360
366
|
memberCount: z.number().int(),
|
|
367
|
+
defaultLocale: z
|
|
368
|
+
.string()
|
|
369
|
+
.optional()
|
|
370
|
+
.default("ko")
|
|
371
|
+
.describe("상점 기본 언어(이슈 #134, BCP 47). 서버는 항상 싣는다"),
|
|
361
372
|
createdAt: z.string(),
|
|
362
373
|
});
|
|
363
374
|
|
|
@@ -13,7 +13,6 @@ import { RESERVED_STORE_CODES } from "./store";
|
|
|
13
13
|
* 공개 전환·슬러그 변경·호스팅 끄기는 승인(`APPROVAL_REQUIRED`)이다 — 구매자가 보는 화면을 바꾸는 쓰기다.
|
|
14
14
|
*
|
|
15
15
|
* 오류 코드:
|
|
16
|
-
* - 403 `STOREFRONT_HOSTING_DISABLED` — 플랫폼 스위치가 꺼져 새 사이트를 만들 수 없다
|
|
17
16
|
* - 404 `STOREFRONT_SITE_NOT_FOUND` · `STOREFRONT_TEMPLATE_NOT_FOUND` · `STOREFRONT_VERSION_NOT_FOUND`
|
|
18
17
|
* - 409 `STOREFRONT_SITE_EXISTS` — 이미 사이트가 있다(상점당 1개)
|
|
19
18
|
* - 409 `STOREFRONT_SLUG_TAKEN` — 다른 사이트가 쓰거나 보류 중인 슬러그다
|
|
@@ -30,7 +29,7 @@ import { RESERVED_STORE_CODES } from "./store";
|
|
|
30
29
|
* - 503 `STOREFRONT_PREVIEW_NOT_CONFIGURED` — 미리보기 서명 키가 설정되지 않았다
|
|
31
30
|
*
|
|
32
31
|
* 편집(M2b, `/v1/storefront/site/editing`·`files/**`·`checks/**`·`verify`·`builds/**`, 버전 만들기):
|
|
33
|
-
* - 403 `STOREFRONT_EDITING_DISABLED` —
|
|
32
|
+
* - 403 `STOREFRONT_EDITING_DISABLED` — 편집을 쓸 수 없어 셀러 템플릿으로 사이트를 만들 수 없다(사이트 만들기)
|
|
34
33
|
* - 503 `STOREFRONT_EDITING_NOT_CONFIGURED` — 편집 Sandbox가 설정되지 않았다
|
|
35
34
|
* - 409 `EDIT_CAPACITY_FULL` — 플랫폼 전체 동시 편집 상한에 걸렸다. `error.details.retryAfterSeconds` 뒤에 다시 한다
|
|
36
35
|
* - 409 `EDIT_SESSION_REQUIRED` — 편집 미리보기 링크: 편집 환경이 없다
|
|
@@ -392,13 +391,11 @@ export const storefrontSiteSchema = z.object({
|
|
|
392
391
|
});
|
|
393
392
|
export type StorefrontSite = z.infer<typeof storefrontSiteSchema>;
|
|
394
393
|
|
|
395
|
-
/** `GET /v1/storefront/site` —
|
|
394
|
+
/** `GET /v1/storefront/site` — 호스팅 설정과 현재 사이트(없으면 null. 끈 사이트는 싣지 않는다) */
|
|
396
395
|
export const storefrontHostingSchema = z.object({
|
|
397
|
-
enabled: z.boolean().describe("새 사이트를 만들 수 있는가 (
|
|
396
|
+
enabled: z.boolean().describe("새 사이트를 만들 수 있는가 (항상 true)"),
|
|
398
397
|
domain: z.string().describe("호스팅 도메인 (예: `sayren.co`). 사이트 주소는 `{slug}.{domain}`"),
|
|
399
|
-
editingEnabled: z
|
|
400
|
-
.boolean()
|
|
401
|
-
.describe("파일 편집·버전 만들기를 쓸 수 있는가 (플랫폼 편집 스위치와 Sandbox 설정)"),
|
|
398
|
+
editingEnabled: z.boolean().describe("파일 편집·버전 만들기를 쓸 수 있는가 (Sandbox 설정)"),
|
|
402
399
|
site: storefrontSiteSchema.nullable(),
|
|
403
400
|
});
|
|
404
401
|
export type StorefrontHosting = z.infer<typeof storefrontHostingSchema>;
|
|
@@ -574,7 +571,6 @@ export type StorefrontPreviewLink = z.infer<typeof storefrontPreviewLinkSchema>;
|
|
|
574
571
|
// - 결제 복귀·방문 분석·소셜 로그인 허용 목록은 연결된(`ACTIVE`) 도메인을 자동으로 더한다.
|
|
575
572
|
//
|
|
576
573
|
// 오류 코드:
|
|
577
|
-
// - 403 `STOREFRONT_CUSTOM_DOMAINS_DISABLED` — 플랫폼 스위치가 꺼져 도메인을 추가할 수 없다
|
|
578
574
|
// - 400 `STOREFRONT_DOMAIN_INVALID` — 형식이 틀렸거나 연결할 수 없는 도메인이다(`error.details.reason`)
|
|
579
575
|
// - 404 `STOREFRONT_DOMAIN_NOT_FOUND`
|
|
580
576
|
// - 409 `STOREFRONT_DOMAIN_EXISTS` — 이 상점에 이미 추가한 도메인이다
|
|
@@ -798,7 +794,7 @@ export type StorefrontSiteDomain = z.infer<typeof storefrontSiteDomainSchema>;
|
|
|
798
794
|
|
|
799
795
|
/** `GET /v1/storefront/site/domains` — 사이트의 주소 목록(기본 주소 + 내 도메인)과 연결 설정 */
|
|
800
796
|
export const storefrontSiteDomainsSchema = z.object({
|
|
801
|
-
enabled: z.boolean().describe("내 도메인을 추가할 수 있는가 (
|
|
797
|
+
enabled: z.boolean().describe("내 도메인을 추가할 수 있는가 (항상 true)"),
|
|
802
798
|
limit: z.number().int().min(0).describe("상점당 내 도메인 수 상한 (해제한 도메인은 세지 않는다)"),
|
|
803
799
|
target: z.string().describe("CNAME 대상 (예: `sites.sayren.co`)"),
|
|
804
800
|
domains: z.array(storefrontSiteDomainSchema).describe("대표 주소 먼저, 그다음 추가한 순서"),
|
|
@@ -971,7 +967,7 @@ export const storefrontDevLogsSchema = z.object({
|
|
|
971
967
|
export type StorefrontDevLogs = z.infer<typeof storefrontDevLogsSchema>;
|
|
972
968
|
|
|
973
969
|
export const storefrontEditingSchema = z.object({
|
|
974
|
-
enabled: z.boolean().describe("편집을 쓸 수 있는가 (
|
|
970
|
+
enabled: z.boolean().describe("편집을 쓸 수 있는가 (Sandbox 설정)"),
|
|
975
971
|
session: storefrontEditSessionSchema
|
|
976
972
|
.nullable()
|
|
977
973
|
.describe("열린 편집 환경. 잠들었거나 닫았으면 null"),
|