@sayren/store-sdk 0.29.7 → 0.29.8
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 +1768 -223
- package/dist/index.mjs +563 -29
- package/package.json +1 -1
- package/src/client.ts +166 -0
- package/src/index.ts +2 -0
- package/src/schemas/commerce-flow.ts +259 -0
- package/src/schemas/fulfillment.ts +177 -9
- package/src/schemas/misc.ts +2 -0
- package/src/schemas/order.ts +4 -0
- package/src/schemas/product.ts +71 -0
- package/src/schemas/saved-option-set.ts +8 -0
- package/src/schemas/scope.ts +5 -0
- package/src/schemas/shipping-policy.ts +4 -1
- package/src/schemas/stay.ts +90 -0
- package/src/schemas/upload.ts +6 -1
- package/src/schemas/webhook-event.ts +57 -0
package/dist/index.mjs
CHANGED
|
@@ -979,9 +979,73 @@ function fulfillmentTypeOf(value) {
|
|
|
979
979
|
function fulfillmentRuleOf(type) {
|
|
980
980
|
return FULFILLMENT_RULES[fulfillmentTypeOf(type)];
|
|
981
981
|
}
|
|
982
|
-
/**
|
|
983
|
-
|
|
984
|
-
|
|
982
|
+
/**
|
|
983
|
+
* 이행 방식.
|
|
984
|
+
* - `CARRIER` 택배(송장·배송 추적)
|
|
985
|
+
* - `DIRECT` 직접 배달(배송지 있음, 송장 없음)
|
|
986
|
+
* - `PICKUP` 방문 수령(배송지·배송비 없음)
|
|
987
|
+
* - `PROVIDED` 제공 처리(배송 없는 상품)
|
|
988
|
+
*/
|
|
989
|
+
const FULFILLMENT_METHODS = [
|
|
990
|
+
"CARRIER",
|
|
991
|
+
"DIRECT",
|
|
992
|
+
"PICKUP",
|
|
993
|
+
"PROVIDED"
|
|
994
|
+
];
|
|
995
|
+
const fulfillmentMethodSchema = z.enum(FULFILLMENT_METHODS);
|
|
996
|
+
/** 방식별 규칙표 — **유일한 원천이다.** */
|
|
997
|
+
const FULFILLMENT_METHOD_RULES = {
|
|
998
|
+
CARRIER: {
|
|
999
|
+
requiresAddress: true,
|
|
1000
|
+
carrierTracking: true,
|
|
1001
|
+
pickupLocation: false
|
|
1002
|
+
},
|
|
1003
|
+
DIRECT: {
|
|
1004
|
+
requiresAddress: true,
|
|
1005
|
+
carrierTracking: false,
|
|
1006
|
+
pickupLocation: false
|
|
1007
|
+
},
|
|
1008
|
+
PICKUP: {
|
|
1009
|
+
requiresAddress: false,
|
|
1010
|
+
carrierTracking: false,
|
|
1011
|
+
pickupLocation: true
|
|
1012
|
+
},
|
|
1013
|
+
PROVIDED: {
|
|
1014
|
+
requiresAddress: false,
|
|
1015
|
+
carrierTracking: false,
|
|
1016
|
+
pickupLocation: false
|
|
1017
|
+
}
|
|
1018
|
+
};
|
|
1019
|
+
/** 유형별 허용 방식 — 첫 값이 유형 기본이다 */
|
|
1020
|
+
const FULFILLMENT_METHODS_BY_TYPE = {
|
|
1021
|
+
SHIPPING: [
|
|
1022
|
+
"CARRIER",
|
|
1023
|
+
"DIRECT",
|
|
1024
|
+
"PICKUP"
|
|
1025
|
+
],
|
|
1026
|
+
MANUAL: ["PROVIDED", "PICKUP"]
|
|
1027
|
+
};
|
|
1028
|
+
/** 유형의 기본 방식 — 허용 방식을 두지 않은 상품·이 필드 이전 주문상품 */
|
|
1029
|
+
function defaultFulfillmentMethodOf(type) {
|
|
1030
|
+
return FULFILLMENT_METHODS_BY_TYPE[fulfillmentTypeOf(type)][0];
|
|
1031
|
+
}
|
|
1032
|
+
/** 상품의 허용 방식 — 두지 않았으면 유형 기본 하나다 */
|
|
1033
|
+
function fulfillmentMethodsOf(fulfillment) {
|
|
1034
|
+
const methods = (fulfillment.methods ?? []).filter((m) => FULFILLMENT_METHODS.includes(m));
|
|
1035
|
+
return methods.length > 0 ? methods : [defaultFulfillmentMethodOf(fulfillment.type)];
|
|
1036
|
+
}
|
|
1037
|
+
/** 저장된 방식 → 방식. null·모르는 값은 유형 기본이다 */
|
|
1038
|
+
function fulfillmentMethodOf(type, method) {
|
|
1039
|
+
const parsed = fulfillmentMethodSchema.safeParse(method);
|
|
1040
|
+
return parsed.success ? parsed.data : defaultFulfillmentMethodOf(type);
|
|
1041
|
+
}
|
|
1042
|
+
/**
|
|
1043
|
+
* 택배 배송이 필요한가 — 배송비 묶음·배송지·발송 흐름의 판정은 이 함수 하나를 지난다.
|
|
1044
|
+
* 방식을 주면 방식 규칙도 본다(배송 상품의 방문 수령은 배송이 없다). 방식을 모르면 유형 규칙만 본다.
|
|
1045
|
+
*/
|
|
1046
|
+
function requiresShipping(type, method) {
|
|
1047
|
+
if (!fulfillmentRuleOf(type).requiresShipping) return false;
|
|
1048
|
+
return method == null || FULFILLMENT_METHOD_RULES[fulfillmentMethodOf(type, method)].requiresAddress;
|
|
985
1049
|
}
|
|
986
1050
|
/** 반품에 수거가 필요한가 — 비실물 반품은 수거 등록·수거 완료 없이 승인한다 */
|
|
987
1051
|
function requiresCollection(type) {
|
|
@@ -1030,6 +1094,11 @@ function refineShippingConsistency(value, ctx) {
|
|
|
1030
1094
|
});
|
|
1031
1095
|
}
|
|
1032
1096
|
const deliveryTypeDescription = "배송비 유형. `FREE` 무료, `PAID` 유료, `CONDITIONAL_FREE` 조건부 무료";
|
|
1097
|
+
/** 요청의 허용 방식 — 유형마다 받는 값이 다르다. 겹치면 400 */
|
|
1098
|
+
function methodsRequestSchema(type) {
|
|
1099
|
+
return z.array(z.enum(FULFILLMENT_METHODS_BY_TYPE[type])).min(1).refine((methods) => new Set(methods).size === methods.length, { message: "이행 방식이 겹칩니다" }).describe(`허용 이행 방식(이슈 #115). ${type === "SHIPPING" ? "`CARRIER`·`DIRECT`·`PICKUP`" : "`PROVIDED`·`PICKUP`"} 중 1개 이상, 첫 값이 주문서 기본이다. 생략하면 등록은 유형 기본(${type === "SHIPPING" ? "`CARRIER`" : "`PROVIDED`"}), 수정은 지금 값 유지(유형을 바꾸면 유형 기본)`);
|
|
1100
|
+
}
|
|
1101
|
+
const storedMethodsSchema = z.array(z.string()).optional().describe("허용 이행 방식(이슈 #115). 현재 값은 `CARRIER`·`DIRECT`·`PICKUP`·`PROVIDED`이고 값이 추가될 수 있어 문자열로 받는다. 셀러가 두지 않았으면 생략되고 유형 기본(`SHIPPING`은 `CARRIER`, `MANUAL`은 `PROVIDED`)이다");
|
|
1033
1102
|
const shippingCreateSchema = z.strictObject({
|
|
1034
1103
|
deliveryType: deliveryTypeSchema.default("PAID").describe(deliveryTypeDescription),
|
|
1035
1104
|
deliveryFee: z.number().int().min(0).optional().describe("배송비. 원 단위. 생략하면 상점 기본 배송비(`GET /v1/store`의 `shippingPolicy.baseDeliveryFee`)를 저장한다. FREE면 0이거나 생략한다"),
|
|
@@ -1042,8 +1111,12 @@ const shippingCreateSchema = z.strictObject({
|
|
|
1042
1111
|
*/
|
|
1043
1112
|
const productFulfillmentCreateSchema = z.discriminatedUnion("type", [z.strictObject({
|
|
1044
1113
|
type: z.literal("SHIPPING"),
|
|
1045
|
-
shipping: shippingCreateSchema.optional()
|
|
1046
|
-
|
|
1114
|
+
shipping: shippingCreateSchema.optional(),
|
|
1115
|
+
methods: methodsRequestSchema("SHIPPING").optional()
|
|
1116
|
+
}), z.strictObject({
|
|
1117
|
+
type: z.literal("MANUAL"),
|
|
1118
|
+
methods: methodsRequestSchema("MANUAL").optional()
|
|
1119
|
+
})]);
|
|
1047
1120
|
const shippingUpdateSchema = z.strictObject({
|
|
1048
1121
|
deliveryType: deliveryTypeSchema.describe(deliveryTypeDescription),
|
|
1049
1122
|
deliveryFee: z.number().int().min(0).describe("배송비. 원 단위. FREE면 0"),
|
|
@@ -1057,8 +1130,12 @@ const shippingUpdateSchema = z.strictObject({
|
|
|
1057
1130
|
*/
|
|
1058
1131
|
const productFulfillmentUpdateSchema = z.discriminatedUnion("type", [z.strictObject({
|
|
1059
1132
|
type: z.literal("SHIPPING"),
|
|
1060
|
-
shipping: shippingUpdateSchema
|
|
1061
|
-
|
|
1133
|
+
shipping: shippingUpdateSchema,
|
|
1134
|
+
methods: methodsRequestSchema("SHIPPING").optional()
|
|
1135
|
+
}), z.strictObject({
|
|
1136
|
+
type: z.literal("MANUAL"),
|
|
1137
|
+
methods: methodsRequestSchema("MANUAL").optional()
|
|
1138
|
+
})]);
|
|
1062
1139
|
/**
|
|
1063
1140
|
* 저장된 상품 이행 — 알려진 유형의 닫힌 유니온. 서버의 상품 엔티티와 응답이 이 모양을 쓴다.
|
|
1064
1141
|
* 응답 파싱은 `productFulfillmentResponseSchema`(열린 유니온)를 쓴다.
|
|
@@ -1071,8 +1148,12 @@ const productFulfillmentSchema = z.discriminatedUnion("type", [z.object({
|
|
|
1071
1148
|
conditionalFreeAmount: z.number().int().nullable().describe("조건부 무료 기준 묶음 소계. CONDITIONAL_FREE가 아니면 null"),
|
|
1072
1149
|
shippingAddressId: z.string().nullable().describe("출고지 주소 id. null이면 상점 기본 출고지를 따른다"),
|
|
1073
1150
|
returnAddressId: z.string().nullable().describe("반품지 주소 id. null이면 상점 기본 반품지를 따른다")
|
|
1074
|
-
})
|
|
1075
|
-
|
|
1151
|
+
}),
|
|
1152
|
+
methods: storedMethodsSchema
|
|
1153
|
+
}), z.object({
|
|
1154
|
+
type: z.literal("MANUAL"),
|
|
1155
|
+
methods: storedMethodsSchema
|
|
1156
|
+
})]);
|
|
1076
1157
|
/**
|
|
1077
1158
|
* 열린 응답 유니온 — 알려진 유형은 판별 유니온으로 검사하고, **모르는 유형만** `{ type: "OTHER", rawType }`로 읽는다.
|
|
1078
1159
|
*
|
|
@@ -1086,6 +1167,16 @@ function openFulfillmentUnion(known) {
|
|
|
1086
1167
|
}))]);
|
|
1087
1168
|
}
|
|
1088
1169
|
const productFulfillmentResponseSchema = openFulfillmentUnion(productFulfillmentSchema).describe("상품 이행. `type`이 유형이고 같은 이름의 키가 유형별 속성이다. 값이 추가될 수 있어 SDK는 모르는 유형을 `{ type: \"OTHER\", rawType }`로 읽는다");
|
|
1170
|
+
const snapshotMethodSchema = z.string().optional().describe("주문 시점 이행 방식(이슈 #115). 현재 값은 `CARRIER`·`DIRECT`·`PICKUP`·`PROVIDED`이고 값이 추가될 수 있어 문자열로 받는다. 없으면 유형 기본");
|
|
1171
|
+
/** 주문상품의 주문 시점 픽업 장소 — 장소를 고치거나 지워도 이 주문의 안내는 바뀌지 않는다 */
|
|
1172
|
+
const pickupLocationSnapshotSchema = z.object({
|
|
1173
|
+
locationId: z.string(),
|
|
1174
|
+
name: z.string(),
|
|
1175
|
+
address: z.string(),
|
|
1176
|
+
phone: z.string().nullable(),
|
|
1177
|
+
hours: z.string().nullable()
|
|
1178
|
+
});
|
|
1179
|
+
const snapshotPickupSchema = pickupLocationSnapshotSchema.optional().describe("방문 수령(`PICKUP`)에서 고른 장소(주문 시점 값). 픽업 장소를 두지 않은 상점이거나 다른 방식이면 생략");
|
|
1089
1180
|
/**
|
|
1090
1181
|
* 주문상품의 주문 시점 이행 — 결제 확정이 주문서 줄에서 굳힌다. 상품의 현재 값이 아니다. 서버는 주문상품 컬럼
|
|
1091
1182
|
* (`fulfillment_type`·`delivery_bundle_key`)과 jsonb(`fulfillment_snapshot`)를 합쳐 이 모양을 만든다.
|
|
@@ -1095,9 +1186,35 @@ const orderItemFulfillmentSnapshotSchema = z.discriminatedUnion("type", [z.objec
|
|
|
1095
1186
|
shipping: z.object({
|
|
1096
1187
|
bundleKey: z.string().nullable().describe("배송 묶음 키. 같은 키의 주문상품이 배송비를 한 번 낸 한 묶음이다. #29 이전 주문은 null"),
|
|
1097
1188
|
returnAddressId: z.string().nullable().describe("주문 시점 반품지 주소 id. null이거나 지워진 주소면 상점 기본 반품지로 안내한다")
|
|
1098
|
-
})
|
|
1099
|
-
|
|
1189
|
+
}),
|
|
1190
|
+
method: snapshotMethodSchema,
|
|
1191
|
+
pickupLocation: snapshotPickupSchema
|
|
1192
|
+
}), z.object({
|
|
1193
|
+
type: z.literal("MANUAL"),
|
|
1194
|
+
method: snapshotMethodSchema,
|
|
1195
|
+
pickupLocation: snapshotPickupSchema
|
|
1196
|
+
})]);
|
|
1100
1197
|
const orderItemFulfillmentSnapshotResponseSchema = openFulfillmentUnion(orderItemFulfillmentSnapshotSchema).describe("주문 시점 이행 스냅샷. 상품을 나중에 고쳐도 바뀌지 않는다. 제공 기록은 `fulfillment`에 있다. 값이 추가될 수 있어 SDK는 모르는 유형을 `OTHER`로 읽는다");
|
|
1198
|
+
/** 상점당 픽업 장소 상한 */
|
|
1199
|
+
const MAX_PICKUP_LOCATIONS = 20;
|
|
1200
|
+
/** 방문 수령(`PICKUP`) 장소 — 상점 설정이다. 구매자가 주문서에서 고르고 주문상품에 주문 시점 값이 남는다 */
|
|
1201
|
+
const pickupLocationSchema = z.object({
|
|
1202
|
+
locationId: z.string(),
|
|
1203
|
+
name: z.string().describe("장소 이름(예: 본점)"),
|
|
1204
|
+
address: z.string().describe("주소"),
|
|
1205
|
+
phone: z.string().nullable().describe("연락처. 없으면 null"),
|
|
1206
|
+
hours: z.string().nullable().describe("수령 가능 시간 안내. 없으면 null"),
|
|
1207
|
+
usable: z.boolean().describe("사용 여부. false면 구매자에게 보이지 않고 주문서에서 고를 수 없다"),
|
|
1208
|
+
sortOrder: z.number().int(),
|
|
1209
|
+
createdAt: z.string()
|
|
1210
|
+
});
|
|
1211
|
+
const pickupLocationRequestSchema = z.strictObject({
|
|
1212
|
+
name: z.string().trim().min(1).max(50),
|
|
1213
|
+
address: z.string().trim().min(1).max(200),
|
|
1214
|
+
phone: z.string().trim().max(30).nullish(),
|
|
1215
|
+
hours: z.string().trim().max(100).nullish(),
|
|
1216
|
+
usable: z.boolean().default(true)
|
|
1217
|
+
});
|
|
1101
1218
|
//#endregion
|
|
1102
1219
|
//#region src/schemas/points.ts
|
|
1103
1220
|
/**
|
|
@@ -1476,14 +1593,82 @@ function proratedRefundBase(totalPrice, quantity, settledQuantity, cancelQuantit
|
|
|
1476
1593
|
return Math.max(0, after - before);
|
|
1477
1594
|
}
|
|
1478
1595
|
//#endregion
|
|
1596
|
+
//#region src/schemas/stay.ts
|
|
1597
|
+
/**
|
|
1598
|
+
* 날짜별 재고·가격(이슈 #118) — 숙박·회차처럼 날짜마다 재고와 가격이 다른 상품. 상품 `inventoryMode: "DATED"`이면 조합(객실) × 날짜
|
|
1599
|
+
* 달력이 재고·가격의 원천이고, 주문서 줄은 기간(`stay`)을 받는다. 날짜는 한국 날짜 `YYYY-MM-DD`다.
|
|
1600
|
+
*/
|
|
1601
|
+
/** 한국 날짜 */
|
|
1602
|
+
const calendarDateSchema = z.string().regex(/^\d{4}-\d{2}-\d{2}$/).refine((value) => {
|
|
1603
|
+
const date = /* @__PURE__ */ new Date(`${value}T00:00:00Z`);
|
|
1604
|
+
return !Number.isNaN(date.getTime()) && date.toISOString().slice(0, 10) === value;
|
|
1605
|
+
}, "날짜 형식이 아닙니다").describe("한국 날짜(YYYY-MM-DD)");
|
|
1606
|
+
/** 한 번에 받는 최대 박수 */
|
|
1607
|
+
const MAX_STAY_NIGHTS = 30;
|
|
1608
|
+
/** 달력 한 번 조회·설정 최대 일수 */
|
|
1609
|
+
const MAX_CALENDAR_DAYS = 400;
|
|
1610
|
+
const inventoryModeSchema = z.enum(["STANDARD", "DATED"]).describe("재고 방식. `STANDARD` 조합 재고 수량 · `DATED` 날짜별 재고·가격(숙박·회차)");
|
|
1611
|
+
/** 숙박 기간 — 체크인 날부터 체크아웃 전날까지가 박이다 */
|
|
1612
|
+
const stayRangeSchema = z.object({
|
|
1613
|
+
checkIn: calendarDateSchema,
|
|
1614
|
+
checkOut: calendarDateSchema
|
|
1615
|
+
}).describe("숙박 기간. 체크인 날부터 체크아웃 전날까지 박마다 재고·가격을 본다");
|
|
1616
|
+
/** 주문 시점 숙박 — 박마다 그때 가격 */
|
|
1617
|
+
const staySnapshotSchema = z.object({
|
|
1618
|
+
checkIn: z.string(),
|
|
1619
|
+
checkOut: z.string(),
|
|
1620
|
+
nights: z.array(z.object({
|
|
1621
|
+
date: z.string(),
|
|
1622
|
+
price: z.number().int()
|
|
1623
|
+
})).describe("박마다 날짜·가격(객실 1개 기준)")
|
|
1624
|
+
});
|
|
1625
|
+
/** 체크인~체크아웃 전날 날짜 목록. 형식이 틀리거나 체크아웃이 체크인 이하면 빈 목록 */
|
|
1626
|
+
function nightsOf(range) {
|
|
1627
|
+
const start = Date.parse(`${range.checkIn}T00:00:00Z`);
|
|
1628
|
+
const end = Date.parse(`${range.checkOut}T00:00:00Z`);
|
|
1629
|
+
if (Number.isNaN(start) || Number.isNaN(end) || end <= start) return [];
|
|
1630
|
+
const nights = [];
|
|
1631
|
+
for (let at = start; at < end; at += 864e5) nights.push(new Date(at).toISOString().slice(0, 10));
|
|
1632
|
+
return nights;
|
|
1633
|
+
}
|
|
1634
|
+
/** 관리 달력 한 칸 */
|
|
1635
|
+
const calendarDaySchema = z.object({
|
|
1636
|
+
variantId: z.string(),
|
|
1637
|
+
date: z.string(),
|
|
1638
|
+
stock: z.number().int().describe("그날 남은 재고"),
|
|
1639
|
+
price: z.number().int().nullable().describe("그날 가격(원). null이면 조합 가격")
|
|
1640
|
+
});
|
|
1641
|
+
const calendarQuerySchema = z.object({
|
|
1642
|
+
variantId: z.string().optional().describe("조합. 생략하면 모든 조합"),
|
|
1643
|
+
from: calendarDateSchema,
|
|
1644
|
+
to: calendarDateSchema.describe("끝 날짜(포함)")
|
|
1645
|
+
});
|
|
1646
|
+
/**
|
|
1647
|
+
* 달력 설정 — 기간의 날짜마다 재고·가격을 덮어쓴다(없는 날은 만든다). `stock`·`price`는 준 것만 바꾸고, `price: null`은 조합 가격으로
|
|
1648
|
+
* 되돌린다. `daysOfWeek`(0=일~6=토)를 주면 그 요일만 바꾼다
|
|
1649
|
+
*/
|
|
1650
|
+
const setCalendarRequestSchema = z.object({
|
|
1651
|
+
variantIds: z.array(z.string()).min(1).max(50),
|
|
1652
|
+
from: calendarDateSchema,
|
|
1653
|
+
to: calendarDateSchema,
|
|
1654
|
+
stock: z.number().int().min(0).max(1e5).optional(),
|
|
1655
|
+
price: z.number().int().min(0).multipleOf(10).nullable().optional(),
|
|
1656
|
+
daysOfWeek: z.array(z.number().int().min(0).max(6)).min(1).max(7).optional()
|
|
1657
|
+
}).refine((value) => value.stock !== void 0 || value.price !== void 0, { message: "stock이나 price 중 하나는 있어야 합니다" });
|
|
1658
|
+
//#endregion
|
|
1479
1659
|
//#region src/schemas/upload.ts
|
|
1480
1660
|
/**
|
|
1481
1661
|
* 업로드 용도. 허용 확장자와 크기 상한이 용도별로 다르다.
|
|
1482
1662
|
*
|
|
1483
1663
|
* - `product-image`: 상품 목록·상세의 상품 이미지. 목록 썸네일로 쓰이므로 정지 이미지만 받는다.
|
|
1484
1664
|
* - `description`: 상세설명 본문에 삽입하는 미디어. 동영상과 svg도 받는다.
|
|
1665
|
+
* - `flow-attachment`: 주문 흐름 행동의 첨부(시안 등, 이슈 #115). 구매자에게 보이므로 정지 이미지와 PDF만 받는다.
|
|
1485
1666
|
*/
|
|
1486
|
-
const uploadPurposeSchema = z.enum([
|
|
1667
|
+
const uploadPurposeSchema = z.enum([
|
|
1668
|
+
"product-image",
|
|
1669
|
+
"description",
|
|
1670
|
+
"flow-attachment"
|
|
1671
|
+
]);
|
|
1487
1672
|
const MB = 1048576;
|
|
1488
1673
|
/**
|
|
1489
1674
|
* 용도별 업로드 제한 — 서버(`POST /v1/uploads`)와 클라이언트가 공유하는 단일 원천이다.
|
|
@@ -1517,6 +1702,18 @@ const UPLOAD_PURPOSE_LIMITS = {
|
|
|
1517
1702
|
"mov"
|
|
1518
1703
|
],
|
|
1519
1704
|
maxBytes: 50 * MB
|
|
1705
|
+
},
|
|
1706
|
+
"flow-attachment": {
|
|
1707
|
+
extensions: [
|
|
1708
|
+
"jpg",
|
|
1709
|
+
"jpeg",
|
|
1710
|
+
"png",
|
|
1711
|
+
"webp",
|
|
1712
|
+
"avif",
|
|
1713
|
+
"gif",
|
|
1714
|
+
"pdf"
|
|
1715
|
+
],
|
|
1716
|
+
maxBytes: 20 * MB
|
|
1520
1717
|
}
|
|
1521
1718
|
};
|
|
1522
1719
|
/** 파일명의 소문자 확장자. 확장자가 없으면 `""` */
|
|
@@ -1618,6 +1815,7 @@ const productVariantSchema = z.object({
|
|
|
1618
1815
|
weightGram: z.number().int().nullable(),
|
|
1619
1816
|
sellerCode: z.string().nullable(),
|
|
1620
1817
|
usable: z.boolean(),
|
|
1818
|
+
attributes: z.record(z.string(), z.string()).optional().describe("조합 속성(이슈 #115) — 키 → 값 문자열(예: 회차 일시 `showAt`). 플로우가 `item.option.<키>`로 읽고 타입(날짜·숫자 등)은 플로우가 선언한다. 없으면 생략"),
|
|
1621
1819
|
hasOrders: z.boolean().optional().describe("주문에 담긴 적이 있는 조합인가(이슈 #59). true인 조합은 옵션 교체에서 뺄 수 없고(409 `OPTION_HAS_ORDERS`) `usable: false`로 판매를 끈다. 서버는 항상 싣는다. 요청에는 쓰지 않는다")
|
|
1622
1820
|
});
|
|
1623
1821
|
/** 옵션 축(그룹) 최대 개수 — 스키마 상한의 단일 원천 */
|
|
@@ -1660,6 +1858,21 @@ const addonGroupSchema = z.object({
|
|
|
1660
1858
|
required: z.boolean().describe("구매자가 꼭 골라야 하는가. false면 고르지 않아도 된다"),
|
|
1661
1859
|
values: z.array(addonValueSchema)
|
|
1662
1860
|
});
|
|
1861
|
+
/**
|
|
1862
|
+
* 직접 입력 타입(이슈 #115 결정 24) — 값은 늘 문자열로 오가고 서버가 타입대로 검사·정규화한다.
|
|
1863
|
+
* `number`는 정수, `select`는 `options` 중 하나, `date`는 `YYYY-MM-DD`, `datetime`은 오프셋 있는 ISO 8601이다.
|
|
1864
|
+
* `image`는 구매자 업로드(`POST /storefront/v1/uploads/order-inputs`) 주소 목록이고 `maxLength`가 최대 장수(1~5)다
|
|
1865
|
+
*/
|
|
1866
|
+
const CUSTOM_INPUT_TYPES = [
|
|
1867
|
+
"text",
|
|
1868
|
+
"number",
|
|
1869
|
+
"select",
|
|
1870
|
+
"date",
|
|
1871
|
+
"datetime",
|
|
1872
|
+
"image"
|
|
1873
|
+
];
|
|
1874
|
+
/** 직접 입력 키 — 플로우 식이 `item.inputs.<key>`로 읽는다. 영문 소문자로 시작하는 영숫자·밑줄 */
|
|
1875
|
+
const customInputKeySchema = z.string().regex(/^[a-z][a-zA-Z0-9_]{0,39}$/).describe("고정 키(영문 소문자로 시작, 영숫자·밑줄 40자). 플로우 식이 `item.inputs.<key>`로 읽는다");
|
|
1663
1876
|
/** 직접 입력 항목 — 예: 각인 문구 */
|
|
1664
1877
|
const customInputSchema = z.object({
|
|
1665
1878
|
inputId: z.string(),
|
|
@@ -1668,7 +1881,10 @@ const customInputSchema = z.object({
|
|
|
1668
1881
|
maxLength: z.number().int().describe("최대 글자 수"),
|
|
1669
1882
|
required: z.boolean(),
|
|
1670
1883
|
usable: z.boolean().describe("사용 여부. false면 구매자에게 보이지 않는다"),
|
|
1671
|
-
sortOrder: z.number().int()
|
|
1884
|
+
sortOrder: z.number().int(),
|
|
1885
|
+
key: z.string().nullable().optional().describe("고정 키. 없으면 null(플로우 식이 읽지 않는다)"),
|
|
1886
|
+
type: z.string().optional().describe("입력 타입. 현재 값은 `text`·`number`·`select`·`date`·`datetime`이고 값이 추가될 수 있어 문자열로 받는다. 없으면 `text`"),
|
|
1887
|
+
options: z.array(z.string()).nullable().optional().describe("`select`의 선택지. 그 밖의 타입은 null")
|
|
1672
1888
|
});
|
|
1673
1889
|
/**
|
|
1674
1890
|
* 직접 입력 항목명에 쓸 수 없는 개인정보성 단어 — 상점 플랫폼 검사와 서버 400(`CUSTOM_INPUT_LABEL_FORBIDDEN`)이 이 목록 하나를 쓴다.
|
|
@@ -1731,7 +1947,11 @@ const customInputRequestSchema = z.object({
|
|
|
1731
1947
|
placeholder: z.string().trim().max(100).nullish(),
|
|
1732
1948
|
maxLength: z.number().int().min(1).max(200),
|
|
1733
1949
|
required: z.boolean().default(false),
|
|
1734
|
-
usable: z.boolean().default(true)
|
|
1950
|
+
usable: z.boolean().default(true),
|
|
1951
|
+
/** 아래 셋은 생략하면 지금 값을 유지한다(새 항목은 키 없음·`text`) — 옛 클라이언트의 저장이 타입을 지우지 않는다 */
|
|
1952
|
+
key: customInputKeySchema.nullish(),
|
|
1953
|
+
type: z.enum(CUSTOM_INPUT_TYPES).optional().describe("입력 타입. 생략하면 지금 값 유지(새 항목은 `text`)"),
|
|
1954
|
+
options: z.array(z.string().trim().min(1).max(50)).min(1).max(30).nullish().describe("`select`의 선택지(1~30개). `select`가 아니면 생략하거나 null")
|
|
1735
1955
|
});
|
|
1736
1956
|
/**
|
|
1737
1957
|
* 주문상품·장바구니·주문서 줄의 옵션 선택 스냅샷 한 칸 — 주문 시점 이름이다(상품을 고쳐도 바뀌지 않는다).
|
|
@@ -1746,7 +1966,9 @@ const optionSelectionSchema = z.object({
|
|
|
1746
1966
|
/** 구매자가 적은 직접 입력값 — 주문 시점 항목명과 값 */
|
|
1747
1967
|
const customInputValueSchema = z.object({
|
|
1748
1968
|
label: z.string(),
|
|
1749
|
-
value: z.string()
|
|
1969
|
+
value: z.string(),
|
|
1970
|
+
key: z.string().nullable().optional().describe("항목의 고정 키(주문 시점). 없으면 null"),
|
|
1971
|
+
type: z.string().optional().describe("항목의 입력 타입(주문 시점). 없으면 `text`")
|
|
1750
1972
|
});
|
|
1751
1973
|
const discountSchema = z.object({
|
|
1752
1974
|
productId: z.string(),
|
|
@@ -1777,6 +1999,7 @@ const productSchema = productSummarySchema.extend({
|
|
|
1777
1999
|
customInputs: z.array(customInputSchema).optional().default([]).describe("직접 입력 항목(이슈 #59). 사용하지 않는 항목도 싣는다. 없으면 빈 배열. 서버는 항상 싣는다"),
|
|
1778
2000
|
optionSort: optionSortSchema.optional().default("REGISTERED").describe("옵션 값 정렬 순서(이슈 #59). 서버는 항상 싣는다"),
|
|
1779
2001
|
fulfillment: productFulfillmentResponseSchema,
|
|
2002
|
+
inventoryMode: z.string().optional().describe("재고 방식(이슈 #118). 날짜별 재고 상품만 `DATED`를 싣는다. 없으면 `STANDARD`"),
|
|
1780
2003
|
fulfillmentTypeLocked: z.boolean().describe("판매 이력(주문상품)이 있어 상품 유형(`fulfillment.type`)을 바꿀 수 없는가. true면 다른 유형으로 수정하는 요청이 409 `FULFILLMENT_TYPE_LOCKED`다. 같은 유형 안의 속성은 바꿀 수 있다"),
|
|
1781
2004
|
refundPolicy: productRefundPolicyPatchSchema.nullable().describe("상품별 환불 정책 덮어쓰기(상품이 정한 항목만). null이면 상점 기본 환불 정책을 쓴다. 반품·교환 배송비(`returnDeliveryFee`·`exchangeDeliveryFee`)는 배송 상품에만 있다"),
|
|
1782
2005
|
/**
|
|
@@ -1868,7 +2091,8 @@ const productVariantRequestSchema = z.object({
|
|
|
1868
2091
|
costPrice: z.number().int().min(0).optional(),
|
|
1869
2092
|
weightGram: z.number().int().min(0).optional(),
|
|
1870
2093
|
sellerCode: codeSchema.optional(),
|
|
1871
|
-
usable: z.boolean().default(true)
|
|
2094
|
+
usable: z.boolean().default(true),
|
|
2095
|
+
attributes: z.record(z.string().regex(/^[a-z][a-zA-Z0-9_]{0,39}$/), z.string().max(100)).refine((value) => Object.keys(value).length <= 10, { message: "조합 속성은 10개까지입니다" }).optional().describe("조합 속성(이슈 #115) — 키 → 값 문자열(예: 회차 일시 `showAt`). 플로우가 `item.option.<키>`로 읽고 타입(날짜·숫자 등)은 플로우가 선언한다. 생략하면 지금 값 유지(새 조합은 없음), `{}`면 비운다")
|
|
1872
2096
|
});
|
|
1873
2097
|
/** 축 × 값 → variant 전체 교체 요청 (PUT /products/{productId}/options) */
|
|
1874
2098
|
const optionModelRequestSchema = z.object({
|
|
@@ -1931,7 +2155,8 @@ const productWriteShape = {
|
|
|
1931
2155
|
})).optional(),
|
|
1932
2156
|
refundPolicy: productRefundPolicyPatchSchema.nullish().describe("상품별 환불 정책 — 준 항목만 상점 기본을 덮어쓴다. `null`이나 생략은 상점 기본을 그대로 쓴다는 뜻이다. 반품·교환 배송비(`returnDeliveryFee`·`exchangeDeliveryFee`)는 배송 상품에만 줄 수 있다(다른 유형은 400)"),
|
|
1933
2157
|
...optionModelRequestSchema.shape,
|
|
1934
|
-
sourceOptionSetIds: z.array(z.string()).max(10).optional().describe("쓰기 전용(이슈 #59) — 이 저장으로 옵션을 불러온 저장 옵션 id. 상품 저장과 같은 트랜잭션에서 불러오기 기록을 남겨 저장 옵션의 `importedProductCount`를 센다. 없는 id는 무시한다")
|
|
2158
|
+
sourceOptionSetIds: z.array(z.string()).max(10).optional().describe("쓰기 전용(이슈 #59) — 이 저장으로 옵션을 불러온 저장 옵션 id. 상품 저장과 같은 트랜잭션에서 불러오기 기록을 남겨 저장 옵션의 `importedProductCount`를 센다. 없는 id는 무시한다"),
|
|
2159
|
+
inventoryMode: inventoryModeSchema.optional().describe("재고 방식(이슈 #118). `DATED`면 날짜별 달력(`PUT /products/{id}/calendar`)이 재고·가격이고 주문서 줄은 숙박 기간(`stay`)을 받는다. 생략하면 등록은 `STANDARD`, 수정은 지금 값. 판매 이력이 있으면 바꿀 수 없다(409 `INVENTORY_MODE_LOCKED`)")
|
|
1935
2160
|
};
|
|
1936
2161
|
const productCreateRequestSchema = z.strictObject({
|
|
1937
2162
|
...productWriteShape,
|
|
@@ -2354,6 +2579,195 @@ const collectionPreviewSchema = z.object({
|
|
|
2354
2579
|
salesComputedAt: z.string().nullable().default(null).describe("판매량 기준 시각. 판매량 상위 조건이나 판매량순 정렬을 쓰면 이 시각까지의 주문을 센다. 판매량을 쓰지 않거나 집계 전이면 null")
|
|
2355
2580
|
});
|
|
2356
2581
|
//#endregion
|
|
2582
|
+
//#region src/schemas/commerce-flow.ts
|
|
2583
|
+
/**
|
|
2584
|
+
* 커머스 플로우(이슈 #115) — 주문상품이 따르는 플로우의 지금 상태와 할 수 있는 행동. 공개 계약은 필드 추가로만 자란다.
|
|
2585
|
+
* 행동 키·필드 키·꺼진 이유는 상점·앱이 늘리는 **열린 문자열**이다(모르는 값도 파싱한다). 공개 상태(`coreStatus`)만 닫힌 8개 값이다.
|
|
2586
|
+
* 화면은 이 값만 그리고 상태 이름으로 분기하지 않는다 — 판정은 서버가 한다.
|
|
2587
|
+
*/
|
|
2588
|
+
const flowInputFieldSchema = z.object({
|
|
2589
|
+
key: z.string(),
|
|
2590
|
+
type: z.string().describe("text · number · select · date · datetime · image (늘어날 수 있다)"),
|
|
2591
|
+
required: z.boolean(),
|
|
2592
|
+
label: z.string(),
|
|
2593
|
+
maxLength: z.number().int().optional(),
|
|
2594
|
+
maxFiles: z.number().int().optional(),
|
|
2595
|
+
options: z.array(z.union([z.string(), z.number()])).optional()
|
|
2596
|
+
});
|
|
2597
|
+
const flowActionSchema = z.object({
|
|
2598
|
+
key: z.string().describe("행동 키. 플랫폼 키(예: CONFIRM_ORDER)와 상점·앱이 정한 키가 섞인다"),
|
|
2599
|
+
label: z.string().describe("보여 줄 이름"),
|
|
2600
|
+
mode: z.enum([
|
|
2601
|
+
"INSTANT",
|
|
2602
|
+
"REQUEST",
|
|
2603
|
+
"VIEW"
|
|
2604
|
+
]).describe("INSTANT 바로 실행 · REQUEST 승인 요청(클레임) · VIEW 보기"),
|
|
2605
|
+
enabled: z.boolean(),
|
|
2606
|
+
disabled: z.object({
|
|
2607
|
+
reason: z.string().describe("EXPIRED · CONDITION (늘어날 수 있다)"),
|
|
2608
|
+
message: z.string().optional()
|
|
2609
|
+
}).optional().describe("꺼진 이유. 켜져 있으면 없다"),
|
|
2610
|
+
availableUntil: z.string().optional().describe("이 시각까지만 할 수 있다(ISO 8601)"),
|
|
2611
|
+
subflow: z.string().optional().describe("이 행동이 시작하는 하위 플로우(클레임)"),
|
|
2612
|
+
input: z.array(flowInputFieldSchema).optional().describe("받는 입력 폼"),
|
|
2613
|
+
partialQuantity: z.union([z.boolean(), z.literal("UNIT")]).optional()
|
|
2614
|
+
});
|
|
2615
|
+
/** 커스텀 필드 값 — 문자열(날짜·일시는 ISO 8601)·숫자·참거짓·null, 수량 단위 필드는 문자열 배열 */
|
|
2616
|
+
const flowFieldValueSchema = z.union([
|
|
2617
|
+
z.string(),
|
|
2618
|
+
z.number(),
|
|
2619
|
+
z.boolean(),
|
|
2620
|
+
z.null(),
|
|
2621
|
+
z.array(z.string())
|
|
2622
|
+
]);
|
|
2623
|
+
const flowStateSchema = z.object({
|
|
2624
|
+
key: z.string().describe("플로우 안 상태 키(상점이 정한다). 화면 분기에 쓰지 않는다"),
|
|
2625
|
+
label: z.string().describe("보는 사람(셀러·구매자)의 상태 이름"),
|
|
2626
|
+
coreStatus: orderItemStatusSchema.optional().describe("공개 상태(8개)"),
|
|
2627
|
+
claimStatus: claimStatusSchema.optional(),
|
|
2628
|
+
message: z.string().optional().describe("보는 사람에게 보여 줄 안내문"),
|
|
2629
|
+
enteredAt: z.string().describe("이 상태에 들어온 시각(ISO 8601)"),
|
|
2630
|
+
deadlineAt: z.string().optional().describe("가장 가까운 기한(ISO 8601)"),
|
|
2631
|
+
attachments: z.array(z.string()).optional().describe("가장 최근 행동이 붙인 첨부 주소(시안 등, #115). 없으면 생략"),
|
|
2632
|
+
progress: z.boolean().optional().describe("진행 단계 표시에 넣는 상태인가"),
|
|
2633
|
+
fields: z.record(z.string(), flowFieldValueSchema).describe("보는 사람 공개 범위의 커스텀 필드")
|
|
2634
|
+
});
|
|
2635
|
+
const orderItemFlowSchema = z.object({
|
|
2636
|
+
orderItemId: z.string(),
|
|
2637
|
+
flow: z.object({
|
|
2638
|
+
flowId: z.string(),
|
|
2639
|
+
version: z.number().int()
|
|
2640
|
+
}),
|
|
2641
|
+
flowState: flowStateSchema,
|
|
2642
|
+
actions: z.array(flowActionSchema),
|
|
2643
|
+
timers: z.array(z.object({
|
|
2644
|
+
key: z.string(),
|
|
2645
|
+
dueAt: z.string(),
|
|
2646
|
+
paused: z.boolean()
|
|
2647
|
+
})).describe("걸린 타이머(셀러 보기)"),
|
|
2648
|
+
ended: z.boolean()
|
|
2649
|
+
});
|
|
2650
|
+
const flowActionRequestSchema = z.object({ input: z.record(z.string(), z.unknown()).optional().describe("행동 입력 — 행동의 `input` 폼 키") });
|
|
2651
|
+
/**
|
|
2652
|
+
* 행동 실행 결과. 지금은 동기 완료(COMPLETED)뿐이다. 외부 호출이 든 전이는 202와 함께 ACCEPTED(runId)가 온다(HTTP·앱 노드 단계에서 더한다).
|
|
2653
|
+
* 동기 거절은 409(ACTION_NOT_AVAILABLE)다.
|
|
2654
|
+
*/
|
|
2655
|
+
const flowActionResultSchema = z.object({
|
|
2656
|
+
status: z.literal("COMPLETED"),
|
|
2657
|
+
flowState: flowStateSchema,
|
|
2658
|
+
actions: z.array(flowActionSchema),
|
|
2659
|
+
/** 이 행동으로 바뀐 주문상품(주문 묶음 진행이면 여럿) */
|
|
2660
|
+
affectedOrderItemIds: z.array(z.string())
|
|
2661
|
+
});
|
|
2662
|
+
/** 플로우 작성 그래프와 정의는 형태가 크고 노드 종류가 늘어나므로 여기서는 열린 객체로 싣는다(검증은 서버 `…/draft/check`) */
|
|
2663
|
+
const flowDocumentSchema = z.record(z.string(), z.unknown());
|
|
2664
|
+
const flowPresetSummarySchema = z.object({
|
|
2665
|
+
key: z.string(),
|
|
2666
|
+
presetVersion: z.number().int(),
|
|
2667
|
+
name: z.string(),
|
|
2668
|
+
description: z.string(),
|
|
2669
|
+
availability: z.enum(["AVAILABLE", "BLOCKED"]).describe("BLOCKED면 의존 이슈(dependsOn)가 끝나야 설치할 수 있다"),
|
|
2670
|
+
dependsOn: z.array(z.string()),
|
|
2671
|
+
requires: flowDocumentSchema.describe("프리셋이 쓰는 Core 기능(진행 단위·이행 방식·주문 입력 등)"),
|
|
2672
|
+
variables: z.array(flowDocumentSchema).describe("셀러가 값만 입력하는 변수 정의")
|
|
2673
|
+
});
|
|
2674
|
+
const commerceFlowSummarySchema = z.object({
|
|
2675
|
+
flowId: z.string(),
|
|
2676
|
+
key: z.string().describe("상점 안 유일한 키"),
|
|
2677
|
+
name: z.string(),
|
|
2678
|
+
progression: z.enum(["ITEM", "ORDER_GROUP"]),
|
|
2679
|
+
fulfillmentMethods: z.array(z.string()),
|
|
2680
|
+
presetKey: z.string().nullable().describe("설치한 프리셋(설치 뒤 연결되지 않는다)"),
|
|
2681
|
+
presetVersion: z.number().int().nullable(),
|
|
2682
|
+
activeVersion: z.number().int().nullable().describe("게시된 버전. 새 주문이 따른다"),
|
|
2683
|
+
archivedAt: z.string().nullable(),
|
|
2684
|
+
createdAt: z.string(),
|
|
2685
|
+
updatedAt: z.string()
|
|
2686
|
+
});
|
|
2687
|
+
const commerceFlowVersionViewSchema = z.object({
|
|
2688
|
+
version: z.number().int(),
|
|
2689
|
+
status: z.enum([
|
|
2690
|
+
"DRAFT",
|
|
2691
|
+
"ACTIVE",
|
|
2692
|
+
"LEGACY"
|
|
2693
|
+
]),
|
|
2694
|
+
revision: z.number().int().describe("초안 저장의 If-Match 값"),
|
|
2695
|
+
graph: flowDocumentSchema,
|
|
2696
|
+
definition: flowDocumentSchema,
|
|
2697
|
+
variables: z.record(z.string(), z.unknown()),
|
|
2698
|
+
publishedAt: z.string().nullable()
|
|
2699
|
+
});
|
|
2700
|
+
const commerceFlowSchema = commerceFlowSummarySchema.extend({
|
|
2701
|
+
draft: commerceFlowVersionViewSchema.nullable(),
|
|
2702
|
+
active: commerceFlowVersionViewSchema.nullable(),
|
|
2703
|
+
versions: z.array(z.object({
|
|
2704
|
+
version: z.number().int(),
|
|
2705
|
+
status: z.enum([
|
|
2706
|
+
"DRAFT",
|
|
2707
|
+
"ACTIVE",
|
|
2708
|
+
"LEGACY"
|
|
2709
|
+
]),
|
|
2710
|
+
publishedAt: z.string().nullable()
|
|
2711
|
+
}))
|
|
2712
|
+
});
|
|
2713
|
+
const createCommerceFlowRequestSchema = z.object({
|
|
2714
|
+
key: z.string().regex(/^[a-z][a-z0-9-]{1,48}$/).describe("상점 안 유일한 키(소문자·숫자·하이픈)"),
|
|
2715
|
+
name: z.string().min(1).max(60).optional(),
|
|
2716
|
+
presetKey: z.string().optional().describe("설치할 프리셋. 없으면 빈 플로우"),
|
|
2717
|
+
variables: z.record(z.string(), z.unknown()).optional().describe("프리셋 변수 값")
|
|
2718
|
+
});
|
|
2719
|
+
const saveFlowDraftRequestSchema = z.object({
|
|
2720
|
+
graph: flowDocumentSchema,
|
|
2721
|
+
definition: flowDocumentSchema.optional(),
|
|
2722
|
+
variables: z.record(z.string(), z.unknown()).optional()
|
|
2723
|
+
});
|
|
2724
|
+
const flowIssueSchema = z.object({
|
|
2725
|
+
code: z.string(),
|
|
2726
|
+
message: z.string(),
|
|
2727
|
+
nodeId: z.string().optional(),
|
|
2728
|
+
edgeId: z.string().optional()
|
|
2729
|
+
});
|
|
2730
|
+
const commerceFlowCheckSchema = z.object({
|
|
2731
|
+
publishable: z.boolean().describe("게시를 막는 오류(실행 불가·공개 계약·한도)가 없다"),
|
|
2732
|
+
blocking: z.array(flowIssueSchema),
|
|
2733
|
+
warnings: z.array(flowIssueSchema).describe("업무 논리 경고 — 게시를 막지 않는다")
|
|
2734
|
+
});
|
|
2735
|
+
const flowAssignmentRuleSchema = z.object({
|
|
2736
|
+
ruleId: z.string(),
|
|
2737
|
+
priority: z.number().int().describe("작을수록 먼저 본다"),
|
|
2738
|
+
condition: z.string().describe("CEL 조건식. 읽는 값: product(id·category·categoryPath·tags), order(amount·paymentMethod), buyer(member). 예: `\"cat_1\" in product.categoryPath`"),
|
|
2739
|
+
flowId: z.string()
|
|
2740
|
+
});
|
|
2741
|
+
const saveFlowAssignmentRulesRequestSchema = z.object({ rules: z.array(z.object({
|
|
2742
|
+
condition: z.string().min(1).max(500),
|
|
2743
|
+
flowId: z.string()
|
|
2744
|
+
})).max(50).describe("위에서부터 처음 맞는 규칙의 게시된 플로우를 쓴다. 목록 전체를 바꾼다") });
|
|
2745
|
+
const resolvedFlowSchema = z.object({
|
|
2746
|
+
flowId: z.string(),
|
|
2747
|
+
version: z.number().int(),
|
|
2748
|
+
source: z.enum(["RULE", "PLATFORM"]).describe("RULE 할당 규칙 · PLATFORM 맞는 규칙이 없어 플랫폼 기본 플로우"),
|
|
2749
|
+
ruleId: z.string().optional()
|
|
2750
|
+
});
|
|
2751
|
+
const testFlowAssignmentRequestSchema = z.object({
|
|
2752
|
+
productId: z.string(),
|
|
2753
|
+
orderAmount: z.number().int().nonnegative().optional(),
|
|
2754
|
+
paymentMethod: z.string().optional(),
|
|
2755
|
+
member: z.boolean().optional()
|
|
2756
|
+
});
|
|
2757
|
+
/** 시크릿 이름 — 플로우 변수 `secretRef`의 값이다 */
|
|
2758
|
+
const flowSecretNameSchema = z.string().regex(/^[a-z][a-z0-9-]{1,39}$/).describe("시크릿 이름(소문자·숫자·하이픈 2~40자). 플로우 변수(시크릿)의 값으로 쓴다");
|
|
2759
|
+
/** HTTP 노드가 부를 셀러 API — 헤더 값은 응답에 싣지 않는다 */
|
|
2760
|
+
const flowSecretSchema = z.object({
|
|
2761
|
+
name: z.string(),
|
|
2762
|
+
url: z.string().describe("요청 주소(https)"),
|
|
2763
|
+
headerNames: z.array(z.string()).describe("저장한 헤더 이름(값은 보이지 않는다)"),
|
|
2764
|
+
updatedAt: z.string()
|
|
2765
|
+
});
|
|
2766
|
+
const saveFlowSecretRequestSchema = z.object({
|
|
2767
|
+
url: z.url().refine((value) => value.startsWith("https://"), { message: "https 주소만 받습니다" }).describe("요청 주소. https만, 사설·루프백 주소는 400 `FLOW_SECRET_URL_INVALID`"),
|
|
2768
|
+
headers: z.record(z.string().regex(/^[A-Za-z0-9-]{1,64}$/), z.string().max(2e3)).refine((value) => Object.keys(value).length <= 10, { message: "헤더는 10개까지입니다" }).default({}).describe("함께 보낼 헤더(인증 등). 값은 암호화해 두고 다시 보여 주지 않는다")
|
|
2769
|
+
});
|
|
2770
|
+
//#endregion
|
|
2357
2771
|
//#region src/schemas/promotion.ts
|
|
2358
2772
|
/**
|
|
2359
2773
|
* 쿠폰 금액 계산 (이슈 #47) — 쿠폰 할인을 **얼마나, 어느 주문상품에** 주는지를 정한다.
|
|
@@ -3529,7 +3943,8 @@ const eventTypeSchema = z.enum([
|
|
|
3529
3943
|
"CLAIM.COMPLETED",
|
|
3530
3944
|
"INQUIRY.CREATED",
|
|
3531
3945
|
"REVIEW.CREATED",
|
|
3532
|
-
"PRODUCT.OUT_OF_STOCK"
|
|
3946
|
+
"PRODUCT.OUT_OF_STOCK",
|
|
3947
|
+
"ORDER.FLOW_NOTIFICATION"
|
|
3533
3948
|
]).describe("웹훅 이벤트 타입. `ORDER.ADDRESS_CHANGE_REQUESTED`는 현재 발송하지 않음(호환을 위해 값만 남았고, 구독해도 이벤트가 오지 않는다)");
|
|
3534
3949
|
const webhookStatusSchema = z.enum(["ACTIVE", "SUSPENDED"]).describe("구독 상태. `ACTIVE`=발송 대상, `SUSPENDED`=24시간 이상 연속 전송 실패로 발송이 정지된 상태. 정지 중 발생한 이벤트는 적재하지 않는다. 재개(`POST /webhooks/{id}/resume`)하거나 구독을 수정하면 ACTIVE로 돌아간다");
|
|
3535
3950
|
const webhookSchema = z.object({
|
|
@@ -4107,6 +4522,7 @@ const orderItemSchema = z.object({
|
|
|
4107
4522
|
optionName: z.string().nullable(),
|
|
4108
4523
|
optionSelections: z.array(optionSelectionSchema).optional().default([]).describe("주문 시점 옵션 선택(이슈 #59) — 조합 옵션(옵션명마다 한 칸, 추가금 0)과 추가 선택(값의 추가금). 옵션이 없거나 이 필드 이전 주문은 빈 배열. 서버는 항상 싣는다"),
|
|
4109
4524
|
customInputs: z.array(customInputValueSchema).optional().default([]).describe("구매자가 적은 직접 입력값(주문 시점 항목명과 값, 이슈 #59). 없으면 빈 배열. 서버는 항상 싣는다"),
|
|
4525
|
+
stay: staySnapshotSchema.optional().describe("숙박 기간과 박별 가격(날짜별 재고 상품만, 이슈 #118). 없으면 생략"),
|
|
4110
4526
|
sellerCode: z.string().nullable(),
|
|
4111
4527
|
fulfillmentSnapshot: orderItemFulfillmentSnapshotResponseSchema.describe("주문 시점 이행 스냅샷(이슈 #57). `type`이 주문 시점 상품 유형이다. 배송 상품이 아니면 발송·배송완료 대신 제공 처리를 하고, `DELIVERED`는 제공 완료다. 상품을 나중에 고쳐도 바뀌지 않는다. 제공 기록은 `fulfillment`에 있다"),
|
|
4112
4528
|
quantity: z.number().int().describe("주문 수량"),
|
|
@@ -4365,7 +4781,10 @@ const savedCustomInputSchema = z.object({
|
|
|
4365
4781
|
label: z.string(),
|
|
4366
4782
|
placeholder: z.string().nullable(),
|
|
4367
4783
|
maxLength: z.number().int(),
|
|
4368
|
-
required: z.boolean()
|
|
4784
|
+
required: z.boolean(),
|
|
4785
|
+
key: z.string().nullable().optional().describe("고정 키(#115). 없으면 생략"),
|
|
4786
|
+
type: z.string().optional().describe("입력 타입(#115). 없으면 `text`"),
|
|
4787
|
+
options: z.array(z.string()).nullable().optional().describe("`select`의 선택지")
|
|
4369
4788
|
});
|
|
4370
4789
|
const savedOptionSetSchema = z.object({
|
|
4371
4790
|
optionSetId: z.string(),
|
|
@@ -4391,7 +4810,11 @@ const savedCustomInputRequestSchema = z.object({
|
|
|
4391
4810
|
label: z.string().trim().min(1).max(30),
|
|
4392
4811
|
placeholder: z.string().trim().max(100).nullish(),
|
|
4393
4812
|
maxLength: z.number().int().min(1).max(200),
|
|
4394
|
-
required: z.boolean().default(false)
|
|
4813
|
+
required: z.boolean().default(false),
|
|
4814
|
+
/** 타입 있는 주문 입력(#115) — 상품 직접 입력과 같은 규칙. 생략하면 키 없음·`text` */
|
|
4815
|
+
key: customInputRequestSchema.shape.key,
|
|
4816
|
+
type: customInputRequestSchema.shape.type,
|
|
4817
|
+
options: customInputRequestSchema.shape.options
|
|
4395
4818
|
});
|
|
4396
4819
|
/**
|
|
4397
4820
|
* 저장 옵션 만들기·수정 본문. 조합 옵션명은 최대 `MAX_OPTION_GROUPS`개, 추가 선택은 최대 `MAX_ADDON_GROUPS`개이고
|
|
@@ -4840,7 +5263,7 @@ function quoteDelivery(input) {
|
|
|
4840
5263
|
for (const line of input.lines) {
|
|
4841
5264
|
const product = input.productOf(line.productId);
|
|
4842
5265
|
if (!product) continue;
|
|
4843
|
-
if (!requiresShipping(line.fulfillmentType ?? product.fulfillmentType)) continue;
|
|
5266
|
+
if (!requiresShipping(line.fulfillmentType ?? product.fulfillmentType, line.fulfillmentMethod)) continue;
|
|
4844
5267
|
shippableAmount += line.amount;
|
|
4845
5268
|
const key = deliveryBundleKeyOf(product);
|
|
4846
5269
|
const group = groups.get(key) ?? {
|
|
@@ -6346,7 +6769,11 @@ function createStoreClient(options) {
|
|
|
6346
6769
|
updateVariantStock: (productId, variantId, body) => storeHttp.request("PATCH", path`/products/${productId}/variants/${variantId}/stock`, variantStockSchema, { body: variantStockRequestSchema.parse(body) }),
|
|
6347
6770
|
getDiscount: (productId) => storeHttp.request("GET", path`/products/${productId}/discount`, discountSchema),
|
|
6348
6771
|
setDiscount: (productId, body) => storeHttp.request("PUT", path`/products/${productId}/discount`, discountSchema, { body: discountRequestSchema.parse(body) }),
|
|
6349
|
-
removeDiscount: (productId) => storeHttp.requestVoid("DELETE", path`/products/${productId}/discount`)
|
|
6772
|
+
removeDiscount: (productId) => storeHttp.requestVoid("DELETE", path`/products/${productId}/discount`),
|
|
6773
|
+
/** 날짜별 재고 상품(`inventoryMode: "DATED"`, 이슈 #118)의 기간(포함) 달력. 없는 날은 싣지 않는다 */
|
|
6774
|
+
getCalendar: (productId, query) => storeHttp.request("GET", path`/products/${productId}/calendar`, z.array(calendarDaySchema), { query: calendarQuerySchema.parse(query) }),
|
|
6775
|
+
/** 기간의 날짜마다 조합별 재고·가격을 덮어쓴다. `price: null`은 조합 가격으로 되돌린다 */
|
|
6776
|
+
setCalendar: (productId, body) => storeHttp.request("PUT", path`/products/${productId}/calendar`, z.object({ updated: z.number().int() }), { body: setCalendarRequestSchema.parse(body) })
|
|
6350
6777
|
},
|
|
6351
6778
|
/**
|
|
6352
6779
|
* 저장 옵션 (이슈 #59) — 자주 쓰는 옵션 구성. 불러오기는 복사라 저장 옵션을 고쳐도 불러온 상품은 바뀌지 않는다.
|
|
@@ -6465,7 +6892,55 @@ function createStoreClient(options) {
|
|
|
6465
6892
|
}),
|
|
6466
6893
|
headers: idempotency(idempotencyKey)
|
|
6467
6894
|
}),
|
|
6468
|
-
getDelivery: (orderItemId) => storeHttp.request("GET", path`/order-items/${orderItemId}/delivery`, deliveryStatusSchema)
|
|
6895
|
+
getDelivery: (orderItemId) => storeHttp.request("GET", path`/order-items/${orderItemId}/delivery`, deliveryStatusSchema),
|
|
6896
|
+
/** `GET /order-items/{id}/flow` — 커머스 플로우의 지금 상태·할 수 있는 행동·타이머(#115). 스코프 `order:r` */
|
|
6897
|
+
getFlow: (orderItemId) => storeHttp.request("GET", path`/order-items/${orderItemId}/flow`, orderItemFlowSchema),
|
|
6898
|
+
/**
|
|
6899
|
+
* `POST /order-items/{id}/actions/{key}` — `getFlow().actions`에 켜진 행동을 실행한다(#115). 묶음 진행이면
|
|
6900
|
+
* `affectedOrderItemIds`에 함께 움직인 주문상품이 온다. 에러: 409 `ACTION_NOT_AVAILABLE`
|
|
6901
|
+
*/
|
|
6902
|
+
act: (orderItemId, key, input = {}, idempotencyKey) => storeHttp.request("POST", path`/order-items/${orderItemId}/actions/${key}`, flowActionResultSchema, {
|
|
6903
|
+
body: flowActionRequestSchema.parse({ input }),
|
|
6904
|
+
headers: idempotency(idempotencyKey)
|
|
6905
|
+
}),
|
|
6906
|
+
/**
|
|
6907
|
+
* `POST /order-items/{id}/events/{key}` — 현장 단말·연동의 상점 사건(`custom.<이름>`)을 플로우에 넣는다(#115).
|
|
6908
|
+
* 에러: 400 `FLOW_EVENT_KEY_INVALID`, 409 `FLOW_EVENT_NOT_ACCEPTED`
|
|
6909
|
+
*/
|
|
6910
|
+
emitEvent: (orderItemId, key, input = {}, idempotencyKey) => storeHttp.request("POST", path`/order-items/${orderItemId}/events/${key}`, flowActionResultSchema, {
|
|
6911
|
+
body: flowActionRequestSchema.parse({ input }),
|
|
6912
|
+
headers: idempotency(idempotencyKey)
|
|
6913
|
+
})
|
|
6914
|
+
},
|
|
6915
|
+
/**
|
|
6916
|
+
* 커머스 플로우 (이슈 #115) — 프리셋 설치·초안 저장·검사·게시와 상품 할당 규칙. 조회 `flow:r`, 쓰기 `flow:rw`.
|
|
6917
|
+
* 게시한 버전은 불변이고, 진행 중 주문은 결제 때 붙은 버전으로 끝까지 간다.
|
|
6918
|
+
*/
|
|
6919
|
+
commerceFlows: {
|
|
6920
|
+
presets: () => storeHttp.request("GET", "/flow-presets", z.array(flowPresetSummarySchema)),
|
|
6921
|
+
list: () => storeHttp.request("GET", "/commerce-flows", z.array(commerceFlowSummarySchema)),
|
|
6922
|
+
get: (flowId) => storeHttp.request("GET", path`/commerce-flows/${flowId}`, commerceFlowSchema),
|
|
6923
|
+
/** 프리셋 설치 또는 빈 플로우. 에러: 409 `FLOW_KEY_TAKEN`·`FLOW_PRESET_UNAVAILABLE` */
|
|
6924
|
+
create: (body) => storeHttp.request("POST", "/commerce-flows", commerceFlowSchema, { body: createCommerceFlowRequestSchema.parse(body) }),
|
|
6925
|
+
/** 초안 저장. `revision`을 주면 그 초안일 때만 저장한다(409 `FLOW_REVISION_CONFLICT`) */
|
|
6926
|
+
saveDraft: (flowId, body, revision) => storeHttp.request("PUT", path`/commerce-flows/${flowId}/draft`, commerceFlowSchema, {
|
|
6927
|
+
body: saveFlowDraftRequestSchema.parse(body),
|
|
6928
|
+
headers: revision === void 0 ? void 0 : { "if-match": String(revision) }
|
|
6929
|
+
}),
|
|
6930
|
+
check: (flowId) => storeHttp.request("POST", path`/commerce-flows/${flowId}/draft/check`, commerceFlowCheckSchema),
|
|
6931
|
+
/** 게시. 차단 오류가 있으면 409 `PUBLISH_BLOCKED`(`details.blocking`) */
|
|
6932
|
+
publish: (flowId) => storeHttp.request("POST", path`/commerce-flows/${flowId}/draft/publish`, commerceFlowSchema),
|
|
6933
|
+
rules: () => storeHttp.request("GET", "/commerce-flows/assignment-rules", z.array(flowAssignmentRuleSchema)),
|
|
6934
|
+
/** 할당 규칙 전체 교체(우선순위는 배열 순서). 에러: 400 `FLOW_ASSIGNMENT_CONDITION_INVALID`, 409 `FLOW_NOT_PUBLISHED` */
|
|
6935
|
+
saveRules: (body) => storeHttp.request("PUT", "/commerce-flows/assignment-rules", z.array(flowAssignmentRuleSchema), { body: saveFlowAssignmentRulesRequestSchema.parse(body) }),
|
|
6936
|
+
testRules: (body) => storeHttp.request("POST", "/commerce-flows/assignment-rules/test", resolvedFlowSchema, { body: testFlowAssignmentRequestSchema.parse(body) }),
|
|
6937
|
+
/** 이 상품에 지금 붙을 플로우 */
|
|
6938
|
+
forProduct: (productId) => storeHttp.request("GET", path`/products/${productId}/flow`, resolvedFlowSchema),
|
|
6939
|
+
/** HTTP 노드 시크릿 목록(헤더 값 제외) */
|
|
6940
|
+
secrets: () => storeHttp.request("GET", "/commerce-flows/secrets", z.array(flowSecretSchema)),
|
|
6941
|
+
/** 시크릿 저장(같은 이름이면 덮어쓴다). 상점 플랫폼 OWNER·ADMIN만. 에러: 400 `FLOW_SECRET_URL_INVALID` */
|
|
6942
|
+
saveSecret: (name, body) => storeHttp.request("PUT", path`/commerce-flows/secrets/${name}`, flowSecretSchema, { body: saveFlowSecretRequestSchema.parse(body) }),
|
|
6943
|
+
removeSecret: (name) => storeHttp.requestVoid("DELETE", path`/commerce-flows/secrets/${name}`)
|
|
6469
6944
|
},
|
|
6470
6945
|
carriers: { list: () => storeHttp.request("GET", "/carriers", z.array(carrierSchema)) },
|
|
6471
6946
|
claims: {
|
|
@@ -6779,6 +7254,13 @@ list: (params) => storeHttp.request("GET", "/audit-logs", auditLogPageSchema, {
|
|
|
6779
7254
|
remove: (addressId) => storeHttp.requestVoid("DELETE", path`/seller-addresses/${addressId}`),
|
|
6780
7255
|
setDefault: (addressId) => storeHttp.requestVoid("POST", path`/seller-addresses/${addressId}/default`)
|
|
6781
7256
|
},
|
|
7257
|
+
/** 픽업 장소 (이슈 #115) — 방문 수령 주문의 수령 장소. 조회 `store:r`, 쓰기 `store:rw`(상점 플랫폼 OWNER·ADMIN) */
|
|
7258
|
+
pickupLocations: {
|
|
7259
|
+
list: () => storeHttp.request("GET", "/pickup-locations", z.array(pickupLocationSchema)),
|
|
7260
|
+
create: (body) => storeHttp.request("POST", "/pickup-locations", pickupLocationSchema, { body: pickupLocationRequestSchema.parse(body) }),
|
|
7261
|
+
update: (locationId, body) => storeHttp.request("PUT", path`/pickup-locations/${locationId}`, pickupLocationSchema, { body: pickupLocationRequestSchema.parse(body) }),
|
|
7262
|
+
remove: (locationId) => storeHttp.requestVoid("DELETE", path`/pickup-locations/${locationId}`)
|
|
7263
|
+
},
|
|
6782
7264
|
/**
|
|
6783
7265
|
* 스토어프론트 호스팅 (이슈 #53) — 조회 `storefront:r`, 쓰기 `storefront:rw`(OWNER·ADMIN).
|
|
6784
7266
|
* 쓰기 응답은 바뀐 사이트다. Cloudflare 반영은 커밋 뒤라 `provisioning.status`가 잠시 `PENDING`일 수 있다.
|
|
@@ -7076,7 +7558,8 @@ const STORE_SCOPE_RESOURCES = {
|
|
|
7076
7558
|
customer: ["r", "rw"],
|
|
7077
7559
|
audit: ["r"],
|
|
7078
7560
|
promotion: ["r", "rw"],
|
|
7079
|
-
storefront: ["r", "rw"]
|
|
7561
|
+
storefront: ["r", "rw"],
|
|
7562
|
+
flow: ["r", "rw"]
|
|
7080
7563
|
};
|
|
7081
7564
|
const storeScopeResourceSchema = z.enum(Object.keys(STORE_SCOPE_RESOURCES)).describe("스코프 리소스");
|
|
7082
7565
|
/** 카탈로그상 존재하는 스코프 문자열인가 (예: `settlement:rw`는 false) */
|
|
@@ -7105,7 +7588,8 @@ const STORE_ROLE_SCOPES = {
|
|
|
7105
7588
|
"customer:rw",
|
|
7106
7589
|
"audit:r",
|
|
7107
7590
|
"promotion:rw",
|
|
7108
|
-
"storefront:rw"
|
|
7591
|
+
"storefront:rw",
|
|
7592
|
+
"flow:rw"
|
|
7109
7593
|
],
|
|
7110
7594
|
ADMIN: [
|
|
7111
7595
|
"product:rw",
|
|
@@ -7121,7 +7605,8 @@ const STORE_ROLE_SCOPES = {
|
|
|
7121
7605
|
"customer:rw",
|
|
7122
7606
|
"audit:r",
|
|
7123
7607
|
"promotion:rw",
|
|
7124
|
-
"storefront:rw"
|
|
7608
|
+
"storefront:rw",
|
|
7609
|
+
"flow:rw"
|
|
7125
7610
|
],
|
|
7126
7611
|
STAFF: [
|
|
7127
7612
|
"product:rw",
|
|
@@ -7131,7 +7616,8 @@ const STORE_ROLE_SCOPES = {
|
|
|
7131
7616
|
"inquiry:rw",
|
|
7132
7617
|
"review:rw",
|
|
7133
7618
|
"customer:r",
|
|
7134
|
-
"promotion:r"
|
|
7619
|
+
"promotion:r",
|
|
7620
|
+
"flow:r"
|
|
7135
7621
|
]
|
|
7136
7622
|
};
|
|
7137
7623
|
//#endregion
|
|
@@ -7308,6 +7794,23 @@ const productOutOfStockWebhookEventSchema = z.object({
|
|
|
7308
7794
|
type: z.literal("PRODUCT.OUT_OF_STOCK"),
|
|
7309
7795
|
data: productOutOfStockWebhookEventDataSchema
|
|
7310
7796
|
});
|
|
7797
|
+
/**
|
|
7798
|
+
* 플로우 알림(이슈 #115) — 상점이 플로우에 둔 알림 블록(`core.notify`, 채널 `webhook`)이 보낸다. 구매자 알림(알림톡·메일)은 이 이벤트를 받아
|
|
7799
|
+
* 상점이 보낸다(플랫폼은 구매자에게 직접 보내지 않는다). 개인정보는 싣지 않는다
|
|
7800
|
+
*/
|
|
7801
|
+
const flowNotificationWebhookEventDataSchema = z.object({
|
|
7802
|
+
orderId: z.string().describe("주문 ID"),
|
|
7803
|
+
orderItemIds: z.array(z.string()).describe("이 알림의 주문상품(묶음 진행이면 여럿)"),
|
|
7804
|
+
event: z.string().describe("상점이 블록에 둔 알림 이름(`custom.<이름>`)"),
|
|
7805
|
+
flowId: z.string(),
|
|
7806
|
+
flowVersion: z.number().int(),
|
|
7807
|
+
state: z.string().describe("알림을 보낸 전이의 도착 상태 키")
|
|
7808
|
+
});
|
|
7809
|
+
const flowNotificationWebhookEventSchema = z.object({
|
|
7810
|
+
...envelopeFields,
|
|
7811
|
+
type: z.literal("ORDER.FLOW_NOTIFICATION"),
|
|
7812
|
+
data: flowNotificationWebhookEventDataSchema
|
|
7813
|
+
});
|
|
7311
7814
|
/** 웹훅 요청 본문. `type`으로 판별하며 `data` 형태가 타입별로 다르다 */
|
|
7312
7815
|
const webhookEventSchema = z.discriminatedUnion("type", [
|
|
7313
7816
|
orderWebhookEventSchema,
|
|
@@ -7316,8 +7819,39 @@ const webhookEventSchema = z.discriminatedUnion("type", [
|
|
|
7316
7819
|
claimWebhookEventSchema,
|
|
7317
7820
|
inquiryWebhookEventSchema,
|
|
7318
7821
|
reviewWebhookEventSchema,
|
|
7319
|
-
productOutOfStockWebhookEventSchema
|
|
7822
|
+
productOutOfStockWebhookEventSchema,
|
|
7823
|
+
flowNotificationWebhookEventSchema
|
|
7320
7824
|
]).describe("웹훅 요청 본문 (얇은 이벤트). 개인정보를 싣지 않으며 `data`의 id로 관리 API를 조회한다");
|
|
7825
|
+
/**
|
|
7826
|
+
* 알려진 웹훅 이벤트 타입 — `webhookEventSchema`의 판별 값 목록(이 SDK 버전이 아는 것).
|
|
7827
|
+
* 서버는 새 타입을 구독한 엔드포인트에만 보내지만, 구독을 더 넓힌 수신자를 위해 `parseWebhookEvent`가 모르는 타입을 따로 받는다.
|
|
7828
|
+
*/
|
|
7829
|
+
const KNOWN_WEBHOOK_EVENT_TYPES = webhookEventSchema.options.flatMap((option) => {
|
|
7830
|
+
const type = option.shape.type;
|
|
7831
|
+
return "options" in type ? [...type.options] : [type.value];
|
|
7832
|
+
});
|
|
7833
|
+
/** 이 SDK 버전이 모르는 이벤트 — 봉투만 검증하고 `data`는 그대로 둔다 */
|
|
7834
|
+
const unknownWebhookEventSchema = z.object({
|
|
7835
|
+
...envelopeFields,
|
|
7836
|
+
type: z.string().min(1),
|
|
7837
|
+
data: z.unknown()
|
|
7838
|
+
});
|
|
7839
|
+
/**
|
|
7840
|
+
* 웹훅 본문을 `type`으로 먼저 판별해 읽는다(이슈 #115 결정 25). 알려진 타입은 그 타입의 스키마로 엄격하게 읽고 틀리면 던진다 —
|
|
7841
|
+
* `z.union([known, unknown])`처럼 읽으면 알려진 타입의 파싱 실패가 `known: false`로 조용히 새어 수신자가 처리할 이벤트를 버린다.
|
|
7842
|
+
* 모르는 타입은 봉투만 검증해 `known: false`로 돌려준다(새 이벤트에 옛 SDK가 깨지지 않는다).
|
|
7843
|
+
*/
|
|
7844
|
+
function parseWebhookEvent(body) {
|
|
7845
|
+
const type = body?.type;
|
|
7846
|
+
if (typeof type === "string" && KNOWN_WEBHOOK_EVENT_TYPES.includes(type)) return {
|
|
7847
|
+
known: true,
|
|
7848
|
+
event: webhookEventSchema.parse(body)
|
|
7849
|
+
};
|
|
7850
|
+
return {
|
|
7851
|
+
known: false,
|
|
7852
|
+
event: unknownWebhookEventSchema.parse(body)
|
|
7853
|
+
};
|
|
7854
|
+
}
|
|
7321
7855
|
//#endregion
|
|
7322
7856
|
//#region src/session.ts
|
|
7323
7857
|
/**
|
|
@@ -7498,4 +8032,4 @@ function createStoreSession(options) {
|
|
|
7498
8032
|
};
|
|
7499
8033
|
}
|
|
7500
8034
|
//#endregion
|
|
7501
|
-
export { APPROVAL_ALREADY_DECIDED_CODE, APPROVAL_REQUIRED_CODE, ApiError, ApprovalPendingError, BUSINESS_INFO_MAX_LENGTH, BUSINESS_NUMBER_PATTERN, CASH_RECEIPT_STATUS_VALUES, COLLECTION_BEST_SELLING_DAYS, COLLECTION_PREVIEW_SIZE, COLLECTION_PRODUCT_SORTS, COLLECTION_SALES_SORT_DEFAULT_DAYS, COLLECTION_SLUG_PATTERN, COLLECTION_TYPES, COUPON_CODE_PATTERN, COUPON_CONDITIONS_DEFAULTS, COUPON_TARGET_ALL, COUPON_TARGET_LIST_MAX, CUSTOM_INPUT_FORBIDDEN_WORDS, FULFILLMENT_RULES, MAX_ADDON_GROUPS, MAX_ANALYTICS_ALLOWED_ORIGINS, MAX_AUTO_TRANSITION_DAYS, MAX_COLLECTIONS, MAX_COLLECTION_BEST_SELLING_TOP, MAX_COLLECTION_CREATED_WITHIN_DAYS, MAX_COLLECTION_DESCRIPTION, MAX_COLLECTION_PRODUCTS, MAX_COLLECTION_PRODUCTS_PER_ADD, MAX_COLLECTION_RULES, MAX_COLLECTION_RULE_CATEGORIES, MAX_COLLECTION_TITLE, MAX_CUSTOM_INPUTS, MAX_CUSTOM_INPUT_LENGTH, MAX_OPTION_GROUPS, MAX_PRODUCT_IMAGES, MAX_SAVED_OPTION_SETS, MAX_SAVED_OPTION_SET_NAME, MAX_VALUES_PER_GROUP, MAX_VARIANTS, MCP_TELEMETRY_MAX_RESULTS, MIN_PAYMENT_AMOUNT, NO_COUPON_SETTLEMENT, NO_SHIPPING_BUNDLE_KEY, PAYMENT_ROUTING_EXCLUSION_CODES, POINT_ADJUSTMENT_MAX, POINT_EARN_RATE_BP_MAX, POINT_ENTRY_TYPES, POINT_EXPIRY_DAYS_MAX, POINT_EXPIRY_DAYS_MIN, POINT_LOT_SOURCES, POINT_POLICY_DEFAULTS, POINT_REVIEW_REWARD_MAX, POINT_USE_UNITS, PORTONE_CHANNEL_NAME_MAX_LENGTH, PORTONE_MAX_CHANNELS, PORTONE_MIN_CHANNELS, REFUND_POLICY_DEFAULTS, REFUND_POLICY_DELIVERY_FEE_KEYS, REMOTE_AREA_ZIP_RANGES, RESERVED_STOREFRONT_SLUGS, RESERVED_STORE_CODES, SHIPPING_POLICY_DEFAULTS, STOREFRONT_BLOCKED_PATH_SEGMENTS, STOREFRONT_BUILD_STAGES, STOREFRONT_BUILD_TERMINAL_STATUSES, STOREFRONT_CHECK_TERMINAL_STATUSES, STOREFRONT_CUSTOM_DOMAIN_LIMIT_DEFAULT, STOREFRONT_DOMAIN_DNS_GRACE_DAYS, STOREFRONT_DOMAIN_DNS_WAIT_DAYS, STOREFRONT_DOMAIN_TXT_LABEL, STOREFRONT_EDIT_ACTIVITY_TIMEOUT_MINUTES, STOREFRONT_EDIT_CAPACITY, STOREFRONT_EDIT_IDLE_MINUTES, STOREFRONT_EDIT_PREVIEW_SUFFIX, STOREFRONT_EDIT_START_STAGES, STOREFRONT_FILE_BATCH_MAX, STOREFRONT_FILE_MAX_BYTES, STOREFRONT_PATH_SEGMENT_PATTERN, STOREFRONT_PLATFORM_DOMAINS, STOREFRONT_PUBLIC_SUFFIXES, STOREFRONT_SEARCH_REGEX_MAX_LENGTH, STOREFRONT_SHOWCASE_SLUG_PREFIX, STOREFRONT_SITE_CREATE_LIMIT, STOREFRONT_SLUG_CHANGE_LIMIT, STOREFRONT_SLUG_CHANGE_WINDOW_DAYS, STOREFRONT_SLUG_HOLD_DAYS, STOREFRONT_SLUG_PATTERN, STOREFRONT_SOURCE_BLOB_BATCH_MAX, STOREFRONT_SOURCE_PART_BYTES, STOREFRONT_WORKSPACE_MAX_BYTES, STOREFRONT_WORKSPACE_MAX_FILES, STORE_CODE_PATTERN, STORE_ROLE_SCOPES, STORE_SCOPE_RESOURCES, STORE_SESSION_KEYS, TOSS_WIDGET_CLIENT_KEY_PATTERN, TOSS_WIDGET_KEY_MESSAGE, TOSS_WIDGET_SECRET_KEY_PATTERN, UPLOAD_PURPOSE_LIMITS, VARIANT_COUNT_WARNING, VARIANT_STOCK_EXCLUSIVE_MESSAGE, WEBHOOK_DEFAULT_TOLERANCE_SEC, WEBHOOK_DELIVERY_ID_HEADER, WEBHOOK_EVENT_ID_HEADER, WEBHOOK_EVENT_TYPE_HEADER, WEBHOOK_FAILURE_REASONS, WEBHOOK_HEADERS, WEBHOOK_PAYLOAD_EXCERPT_MAX_BYTES, WEBHOOK_RESOURCE_TYPES, WEBHOOK_SIGNATURE_HEADER, WEBHOOK_USER_AGENT, addStorefrontDomainRequestSchema, addonGroupRequestSchema, addonGroupSchema, addonValueRequestSchema, addonValueSchema, addressChangeRequestListSchema, addressTypeSchema, agentPolicyDecisionSchema, allocateByWeight, analyticsChannelSchema, analyticsCheckoutOutcomeSchema, analyticsCheckoutSchema, analyticsDeviceRowSchema, analyticsDevicesSchema, analyticsFunnelStepSchema, analyticsOriginSchema, analyticsOverviewSchema, analyticsPagesQuerySchema, analyticsPagesSchema, analyticsProductRowSchema, analyticsProductSortSchema, analyticsProductsQuerySchema, analyticsProductsSchema, analyticsRangeQuerySchema, analyticsRealtimeSchema, analyticsSearchQuerySchema, analyticsSearchSchema, analyticsSourceGroupBySchema, analyticsSourceRowSchema, analyticsSourcesQuerySchema, analyticsSourcesSchema, analyticsTotalsSchema, apiLogErrorSchema, apiLogListQuerySchema, apiLogPageSchema, apiLogPrincipalSchema, apiLogPrincipalTypeSchema, apiLogSchema, apiLogStatusFilterSchema, apiLogSummarySchema, approvalDecisionRequestSchema, approvalListQuerySchema, approvalPageSchema, approvalRequestSchema, approvalStatusSchema, approveClaimResultSchema, auditActorSchema, auditActorTypeSchema, auditLogListQuerySchema, auditLogOutcomeSchema, auditLogPageSchema, auditLogSchema, auditLogSourceSchema, bestSellingRuleOf, buildAuthorizeUrl, buildQuery, bulkResultSchema, businessInfoPatchShape, businessInfoResponseShape, businessNumberSchema, cancelBySellerRequestSchema, cancelBySellerResultSchema, carrierSchema, cashReceiptSchema, categoryAttributeSchema, categoryCreateRequestSchema, categoryDeleteQuerySchema, categoryDeleteStrategySchema, categoryListQuerySchema, categoryPatchRequestSchema, categoryProductSortSchema, categorySchema, categorySearchResultSchema, categoryTreeNodeSchema, categoryWithPathSchema, changeStorefrontSlugRequestSchema, changeStorefrontTemplateRequestSchema, changeTypeSchema, claimDetailSchema, claimHoldResultSchema, claimListQuerySchema, claimReasonSchema, claimReturnAddressSchema, claimSchema, claimStatusSchema, claimTypeSchema, claimWebhookEventDataSchema, claimWebhookEventSchema, collectionCreateRequestSchema, collectionListQuerySchema, collectionPageSchema, collectionPatchRequestSchema, collectionPreviewRequestSchema, collectionPreviewSchema, collectionProductListQuerySchema, collectionProductSchema, collectionProductSortRequestSchema, collectionProductsAddRequestSchema, collectionProductsReplaceRequestSchema, collectionRuleCategoryIds, collectionRuleSchema, collectionRuleViewSchema, collectionRulesPredicate, collectionRulesSchema, collectionSchema, collectionStateCountsSchema, collectionStateOf, collectionStateSchema, commerceNumberField, compareBySales, consentActionSchema, consentKindSchema, consentSourceSchema, couponBenefitSchema, couponConditionsInputSchema, couponConditionsSchema, couponDiscountOf, couponIssueListQuerySchema, couponIssueMethodSchema, couponIssueSchema, couponIssueStatusSchema, couponKindSchema, couponListQuerySchema, couponRedemptionListQuerySchema, couponRedemptionSchema, couponRejectReasonSchema, couponRuleSchema, couponSchema, couponStatsSchema, couponStatusSchema, couponTargetInputSchema, couponTargetSchema, createCouponRequestSchema, createPkcePair, createStoreClient, createStoreSession, createStorefrontEditPreviewLinkRequestSchema, createStorefrontPreviewLinkRequestSchema, createStorefrontSiteRequestSchema, createStorefrontVersionRequestSchema, customInputLabelForbiddenWord, customInputRequestSchema, customInputSchema, customInputValueSchema, customerAddressSchema, customerConsentListQuerySchema, customerConsentSchema, customerConsentStateSchema, customerConsentsSchema, customerCouponSchema, customerDelegationRequestSchema, customerDelegationSchema, customerDetailSchema, customerInquiryCategorySchema, customerInquiryListQuerySchema, customerListQuerySchema, customerOrderSchema, customerPointsSchema, customerSortSchema, customerStatsSchema, customerSummarySchema, customerWithdrawalBlockedDetailsSchema, deleteStorefrontFileRequestSchema, deliveryBundleKeyOf, deliveryFeeWaiverSchema, deliveryInfoSchema, deliveryMethodSchema, deliveryStatusSchema, deliveryTypeSchema, descendantCategoryIdsOf, disableStorefrontHostingRequestSchema, discountRequestSchema, discountSchema, dispatchRequestSchema, easyPayProviderResponseSchema, easyPayProviderSchema, eventTypeSchema, exchangeAuthorizationCode, formatOrderNo, fulfillBulkRequestSchema, fulfillRequestSchema, fulfillmentRuleOf, fulfillmentTypeOf, fulfillmentTypeResponseSchema, fulfillmentTypeSchema, holdOrderItemRequestSchema, inquiryListQuerySchema, inquirySchema, inquiryWebhookEventDataSchema, inquiryWebhookEventSchema, invitationDeliveryStatusSchema, invitationListQuerySchema, invitationSchema, inviteMemberRequestSchema, isCouponTargetLine, isEditableStorefrontPath, isReservedStoreCode, isReservedStorefrontSlug, isShowcaseStorefrontSlug, isStoreScope, isWebOrigin, issueCouponRequestSchema, issueCouponResultSchema, liveGateConditionCodeSchema, liveGateConditionSchema, liveGateErrorDetailsSchema, liveGateSchema, loginProviderSchema, loginProviderStatusSchema, loginProviderTestSchema, loginSettingsSchema, maskedSecretSchema, matchesCollectionRules, mcpRuleResultSchema, mcpToolEventSchema, moveStorefrontFileRequestSchema, myAccountSchema, myStoreSchema, normalizeBusinessNumber, normalizeCouponCode, normalizeStorefrontHostname, normalizeStorefrontPath, oauthTokenResponseSchema, openFulfillmentUnion, optionGroupKindSchema, optionGroupRequestSchema, optionGroupSchema, optionModelRequestSchema, optionModelSchema, optionSelectionSchema, optionSortSchema, optionValueRequestSchema, optionValueSchema, orderCanceledWebhookEventDataSchema, orderCanceledWebhookEventSchema, orderDiscountSchema, orderFulfilledWebhookEventDataSchema, orderFulfilledWebhookEventSchema, orderItemFulfillmentSchema, orderItemFulfillmentSnapshotResponseSchema, orderItemFulfillmentSnapshotSchema, orderItemListQuerySchema, orderItemMemoResultSchema, orderItemPageSchema, orderItemSchema, orderItemStatusSchema, orderListQuerySchema, orderSchema, orderSummaryPageSchema, orderSummarySchema, orderWebhookEventDataSchema, orderWebhookEventSchema, pageInfoSchema, pageQueryShape, pageSchema, parseOrderNo, paymentAttemptRecordSchema, paymentAttemptStatusSchema, paymentCredentialSetSchema, paymentFailureWarningSchema, paymentListQuerySchema, paymentProviderSchema, paymentProviderVerificationSchema, paymentRecordDetailSchema, paymentRecordPageSchema, paymentRecordSchema, paymentRecordStatusSchema, paymentRefundRecordSchema, paymentSettingsSchema, pgEnvironmentSchema, pgPaymentMethodSchema, pgProviderSchema, pgVerificationResultSchema, planCodeSchema, planEntitlementsSchema, planErrorDetailsSchema, pointAdjustmentRequestSchema, pointAdjustmentResultSchema, pointEarnOf, pointEarnRateBpSchema, pointEarningEnabled, pointEntrySchema, pointExpiresAtOf, pointHistoryQuerySchema, pointLotSchema, pointPolicyNoticeSchema, pointPolicySchema, pointRestoreExpiresAtOf, pointUseOf, pointUsePolicySchema, policyDocumentUrlSchema, policyVersionSchema, portOneChannelSchema, portOneCredentialsInputSchema, productCreateRequestSchema, productFulfillmentCreateSchema, productFulfillmentResponseSchema, productFulfillmentSchema, productFulfillmentUpdateSchema, productImageRejection, productImageUrlSchema, productListQuerySchema, productOutOfStockWebhookEventDataSchema, productOutOfStockWebhookEventSchema, productPatchRequestSchema, productRefundPolicyOverride, productRefundPolicyPatchSchema, productReplaceRequestSchema, productSchema, productSortSchema, productStatusSchema, productSummarySchema, productVariantRequestSchema, productVariantSchema, proratedPaidRefundBase, proratedPointRefund, proratedRefundBase, publicPlanSchema, publicPlansSchema, publishStorefrontVersionRequestSchema, purchaseDecisionExtendResultSchema, purchaseDecisionRequestResultSchema, purchaseEarnPolicySchema, purchaseEarnRateOf, quoteDelivery, quotePricing, rankBestSelling, refreshUserToken, refundPolicyPatchSchema, refundPolicySchema, rejectClaimRequestSchema, remoteAreaLabelOf, remoteAreaOf, remoteAreaSchema, remoteSurchargeOf, replaceStorefrontSourceRequestSchema, requiresCollection, requiresShipping, resolvePointPolicy, resolveRefundPolicy, resolveShippingPolicy, responsePlanCodeSchema, responsePointEntryTypeSchema, reviewListQuerySchema, reviewReportResultSchema, reviewRewardPointOf, reviewRewardPolicySchema, reviewSchema, reviewSortSchema, reviewWebhookEventDataSchema, reviewWebhookEventSchema, rollbackStorefrontRequestSchema, runStorefrontCheckRequestSchema, salesReportGroupBySchema, salesReportQuerySchema, salesReportRowSchema, salesReportSchema, salesTotalsSchema, saveLoginProviderRequestSchema, savedCustomInputRequestSchema, savedCustomInputSchema, savedOptionGroupRequestSchema, savedOptionGroupSchema, savedOptionSetCompositionSchema, savedOptionSetFromProductRequestSchema, savedOptionSetFromProductResultSchema, savedOptionSetListQuerySchema, savedOptionSetRequestSchema, savedOptionSetSchema, savedOptionSetSortSchema, savedOptionValueRequestSchema, savedOptionValueSchema, scopeAccessSchema, searchStorefrontFilesRequestSchema, sellerAddressListQuerySchema, sellerAddressRequestSchema, sellerAddressSchema, sellerCustomerInquirySchema, setStorefrontVisibilityRequestSchema, settleCouponShortfall, settlementDetailQuerySchema, settlementDetailSchema, settlementListQuerySchema, settlementStatusSchema, settlementSummarySchema, settlementWithDetailsSchema, shippingAddressSchema, shippingPolicyPatchSchema, shippingPolicySchema, splitRefund, storeCodeSchema, storeMemberRoleUpdatedSchema, storeMemberSchema, storePointPolicySchema, storeRoleSchema, storeSchema, storeScopeResourceSchema, storeSubscriptionSchema, storefrontBuildDependenciesSchema, storefrontBuildListQuerySchema, storefrontBuildSchema, storefrontBuildStatusSchema, storefrontCheckSchema, storefrontCheckStatusSchema, storefrontCustomDomainStatusSchema, storefrontCustomHostnameProblem, storefrontDependencyFindingSchema, storefrontDeploymentLogSchema, storefrontDeploymentSchema, storefrontDeploymentStepSchema, storefrontDnsRecordSchema, storefrontDomainSchema, storefrontDomainTxtNameOf, storefrontEditPreviewLabelOf, storefrontEditPreviewSchema, storefrontEditSessionSchema, storefrontEditSessionStatusSchema, storefrontEditingSchema, storefrontFileConflictDetailsSchema, storefrontFileContentQuerySchema, storefrontFileContentSchema, storefrontFileDeleteResultSchema, storefrontFileEncodingSchema, storefrontFileEntrySchema, storefrontFileHashSchema, storefrontFileListQuerySchema, storefrontFileListSchema, storefrontFileMoveResultSchema, storefrontFilePathSchema, storefrontFileSearchResultSchema, storefrontFileWriteResultSchema, storefrontHostingSchema, storefrontPreviewLinkSchema, storefrontProvisioningSchema, storefrontRuleResultSchema, storefrontRuleSeveritySchema, storefrontSiteDomainSchema, storefrontSiteDomainsSchema, storefrontSiteSchema, storefrontSiteStatusSchema, storefrontSlugAvailabilityQuerySchema, storefrontSlugAvailabilitySchema, storefrontSlugSchema, storefrontSourceArchivePartSchema, storefrontSourceArchiveQuerySchema, storefrontSourceBlobsResultSchema, storefrontSourceModeSchema, storefrontSourceRefSchema, storefrontSourceReplacedSchema, storefrontSourceSchema, storefrontSuspensionSchema, storefrontTemplateSchema, storefrontVerifyReportSchema, storefrontVersionCreatedSchema, storefrontVersionSchema, storefrontVersionStatusSchema, storefrontVisibilitySchema, subscriptionLimitsSchema, subscriptionStatusSchema, subscriptionUsageSchema, tossPaymentsCredentialsInputSchema, trackingStageResponseSchema, trackingUpdateResultSchema, updateCouponRequestSchema, updateLoginProviderRequestSchema, updateLoginSettingsRequestSchema, updateMemberRoleRequestSchema, updatePaymentProviderRequestSchema, updatePaymentSettingsRequestSchema, updatePointPolicyRequestSchema, updateStoreRequestSchema, uploadExtensionOf, uploadPurposeSchema, uploadRejection, uploadRequestSchema, uploadStorefrontSourceBlobsRequestSchema, uploadTicketSchema, upsertPortOneProviderRequestSchema, upsertTossPaymentsProviderRequestSchema, variantStockRequestSchema, variantStockSchema, verifyPaymentProviderRequestSchema, webhookCreatedSchema, webhookDeliveryDetailSchema, webhookDeliveryErrorCodeSchema, webhookDeliveryListQuerySchema, webhookDeliveryResourceSchema, webhookDeliverySchema, webhookDeliveryStatusSchema, webhookEventSchema, webhookFailureReasonSchema, webhookRedeliverFailedResultSchema, webhookRequestHeaderSchema, webhookRequestSchema, webhookResourceTypeSchema, webhookSchema, webhookSecretRotatedSchema, webhookStatusSchema, webhookTestRequestSchema, webhookTestResultSchema, withdrawCustomerRequestSchema, writeDryRunResultSchema, writePreviewSchema, writeStorefrontFilesRequestSchema };
|
|
8035
|
+
export { APPROVAL_ALREADY_DECIDED_CODE, APPROVAL_REQUIRED_CODE, ApiError, ApprovalPendingError, BUSINESS_INFO_MAX_LENGTH, BUSINESS_NUMBER_PATTERN, CASH_RECEIPT_STATUS_VALUES, COLLECTION_BEST_SELLING_DAYS, COLLECTION_PREVIEW_SIZE, COLLECTION_PRODUCT_SORTS, COLLECTION_SALES_SORT_DEFAULT_DAYS, COLLECTION_SLUG_PATTERN, COLLECTION_TYPES, COUPON_CODE_PATTERN, COUPON_CONDITIONS_DEFAULTS, COUPON_TARGET_ALL, COUPON_TARGET_LIST_MAX, CUSTOM_INPUT_FORBIDDEN_WORDS, CUSTOM_INPUT_TYPES, FULFILLMENT_METHODS, FULFILLMENT_METHODS_BY_TYPE, FULFILLMENT_METHOD_RULES, FULFILLMENT_RULES, KNOWN_WEBHOOK_EVENT_TYPES, MAX_ADDON_GROUPS, MAX_ANALYTICS_ALLOWED_ORIGINS, MAX_AUTO_TRANSITION_DAYS, MAX_CALENDAR_DAYS, MAX_COLLECTIONS, MAX_COLLECTION_BEST_SELLING_TOP, MAX_COLLECTION_CREATED_WITHIN_DAYS, MAX_COLLECTION_DESCRIPTION, MAX_COLLECTION_PRODUCTS, MAX_COLLECTION_PRODUCTS_PER_ADD, MAX_COLLECTION_RULES, MAX_COLLECTION_RULE_CATEGORIES, MAX_COLLECTION_TITLE, MAX_CUSTOM_INPUTS, MAX_CUSTOM_INPUT_LENGTH, MAX_OPTION_GROUPS, MAX_PICKUP_LOCATIONS, MAX_PRODUCT_IMAGES, MAX_SAVED_OPTION_SETS, MAX_SAVED_OPTION_SET_NAME, MAX_STAY_NIGHTS, MAX_VALUES_PER_GROUP, MAX_VARIANTS, MCP_TELEMETRY_MAX_RESULTS, MIN_PAYMENT_AMOUNT, NO_COUPON_SETTLEMENT, NO_SHIPPING_BUNDLE_KEY, PAYMENT_ROUTING_EXCLUSION_CODES, POINT_ADJUSTMENT_MAX, POINT_EARN_RATE_BP_MAX, POINT_ENTRY_TYPES, POINT_EXPIRY_DAYS_MAX, POINT_EXPIRY_DAYS_MIN, POINT_LOT_SOURCES, POINT_POLICY_DEFAULTS, POINT_REVIEW_REWARD_MAX, POINT_USE_UNITS, PORTONE_CHANNEL_NAME_MAX_LENGTH, PORTONE_MAX_CHANNELS, PORTONE_MIN_CHANNELS, REFUND_POLICY_DEFAULTS, REFUND_POLICY_DELIVERY_FEE_KEYS, REMOTE_AREA_ZIP_RANGES, RESERVED_STOREFRONT_SLUGS, RESERVED_STORE_CODES, SHIPPING_POLICY_DEFAULTS, STOREFRONT_BLOCKED_PATH_SEGMENTS, STOREFRONT_BUILD_STAGES, STOREFRONT_BUILD_TERMINAL_STATUSES, STOREFRONT_CHECK_TERMINAL_STATUSES, STOREFRONT_CUSTOM_DOMAIN_LIMIT_DEFAULT, STOREFRONT_DOMAIN_DNS_GRACE_DAYS, STOREFRONT_DOMAIN_DNS_WAIT_DAYS, STOREFRONT_DOMAIN_TXT_LABEL, STOREFRONT_EDIT_ACTIVITY_TIMEOUT_MINUTES, STOREFRONT_EDIT_CAPACITY, STOREFRONT_EDIT_IDLE_MINUTES, STOREFRONT_EDIT_PREVIEW_SUFFIX, STOREFRONT_EDIT_START_STAGES, STOREFRONT_FILE_BATCH_MAX, STOREFRONT_FILE_MAX_BYTES, STOREFRONT_PATH_SEGMENT_PATTERN, STOREFRONT_PLATFORM_DOMAINS, STOREFRONT_PUBLIC_SUFFIXES, STOREFRONT_SEARCH_REGEX_MAX_LENGTH, STOREFRONT_SHOWCASE_SLUG_PREFIX, STOREFRONT_SITE_CREATE_LIMIT, STOREFRONT_SLUG_CHANGE_LIMIT, STOREFRONT_SLUG_CHANGE_WINDOW_DAYS, STOREFRONT_SLUG_HOLD_DAYS, STOREFRONT_SLUG_PATTERN, STOREFRONT_SOURCE_BLOB_BATCH_MAX, STOREFRONT_SOURCE_PART_BYTES, STOREFRONT_WORKSPACE_MAX_BYTES, STOREFRONT_WORKSPACE_MAX_FILES, STORE_CODE_PATTERN, STORE_ROLE_SCOPES, STORE_SCOPE_RESOURCES, STORE_SESSION_KEYS, TOSS_WIDGET_CLIENT_KEY_PATTERN, TOSS_WIDGET_KEY_MESSAGE, TOSS_WIDGET_SECRET_KEY_PATTERN, UPLOAD_PURPOSE_LIMITS, VARIANT_COUNT_WARNING, VARIANT_STOCK_EXCLUSIVE_MESSAGE, WEBHOOK_DEFAULT_TOLERANCE_SEC, WEBHOOK_DELIVERY_ID_HEADER, WEBHOOK_EVENT_ID_HEADER, WEBHOOK_EVENT_TYPE_HEADER, WEBHOOK_FAILURE_REASONS, WEBHOOK_HEADERS, WEBHOOK_PAYLOAD_EXCERPT_MAX_BYTES, WEBHOOK_RESOURCE_TYPES, WEBHOOK_SIGNATURE_HEADER, WEBHOOK_USER_AGENT, addStorefrontDomainRequestSchema, addonGroupRequestSchema, addonGroupSchema, addonValueRequestSchema, addonValueSchema, addressChangeRequestListSchema, addressTypeSchema, agentPolicyDecisionSchema, allocateByWeight, analyticsChannelSchema, analyticsCheckoutOutcomeSchema, analyticsCheckoutSchema, analyticsDeviceRowSchema, analyticsDevicesSchema, analyticsFunnelStepSchema, analyticsOriginSchema, analyticsOverviewSchema, analyticsPagesQuerySchema, analyticsPagesSchema, analyticsProductRowSchema, analyticsProductSortSchema, analyticsProductsQuerySchema, analyticsProductsSchema, analyticsRangeQuerySchema, analyticsRealtimeSchema, analyticsSearchQuerySchema, analyticsSearchSchema, analyticsSourceGroupBySchema, analyticsSourceRowSchema, analyticsSourcesQuerySchema, analyticsSourcesSchema, analyticsTotalsSchema, apiLogErrorSchema, apiLogListQuerySchema, apiLogPageSchema, apiLogPrincipalSchema, apiLogPrincipalTypeSchema, apiLogSchema, apiLogStatusFilterSchema, apiLogSummarySchema, approvalDecisionRequestSchema, approvalListQuerySchema, approvalPageSchema, approvalRequestSchema, approvalStatusSchema, approveClaimResultSchema, auditActorSchema, auditActorTypeSchema, auditLogListQuerySchema, auditLogOutcomeSchema, auditLogPageSchema, auditLogSchema, auditLogSourceSchema, bestSellingRuleOf, buildAuthorizeUrl, buildQuery, bulkResultSchema, businessInfoPatchShape, businessInfoResponseShape, businessNumberSchema, calendarDateSchema, calendarDaySchema, calendarQuerySchema, cancelBySellerRequestSchema, cancelBySellerResultSchema, carrierSchema, cashReceiptSchema, categoryAttributeSchema, categoryCreateRequestSchema, categoryDeleteQuerySchema, categoryDeleteStrategySchema, categoryListQuerySchema, categoryPatchRequestSchema, categoryProductSortSchema, categorySchema, categorySearchResultSchema, categoryTreeNodeSchema, categoryWithPathSchema, changeStorefrontSlugRequestSchema, changeStorefrontTemplateRequestSchema, changeTypeSchema, claimDetailSchema, claimHoldResultSchema, claimListQuerySchema, claimReasonSchema, claimReturnAddressSchema, claimSchema, claimStatusSchema, claimTypeSchema, claimWebhookEventDataSchema, claimWebhookEventSchema, collectionCreateRequestSchema, collectionListQuerySchema, collectionPageSchema, collectionPatchRequestSchema, collectionPreviewRequestSchema, collectionPreviewSchema, collectionProductListQuerySchema, collectionProductSchema, collectionProductSortRequestSchema, collectionProductsAddRequestSchema, collectionProductsReplaceRequestSchema, collectionRuleCategoryIds, collectionRuleSchema, collectionRuleViewSchema, collectionRulesPredicate, collectionRulesSchema, collectionSchema, collectionStateCountsSchema, collectionStateOf, collectionStateSchema, commerceFlowCheckSchema, commerceFlowSchema, commerceFlowSummarySchema, commerceFlowVersionViewSchema, commerceNumberField, compareBySales, consentActionSchema, consentKindSchema, consentSourceSchema, couponBenefitSchema, couponConditionsInputSchema, couponConditionsSchema, couponDiscountOf, couponIssueListQuerySchema, couponIssueMethodSchema, couponIssueSchema, couponIssueStatusSchema, couponKindSchema, couponListQuerySchema, couponRedemptionListQuerySchema, couponRedemptionSchema, couponRejectReasonSchema, couponRuleSchema, couponSchema, couponStatsSchema, couponStatusSchema, couponTargetInputSchema, couponTargetSchema, createCommerceFlowRequestSchema, createCouponRequestSchema, createPkcePair, createStoreClient, createStoreSession, createStorefrontEditPreviewLinkRequestSchema, createStorefrontPreviewLinkRequestSchema, createStorefrontSiteRequestSchema, createStorefrontVersionRequestSchema, customInputLabelForbiddenWord, customInputRequestSchema, customInputSchema, customInputValueSchema, customerAddressSchema, customerConsentListQuerySchema, customerConsentSchema, customerConsentStateSchema, customerConsentsSchema, customerCouponSchema, customerDelegationRequestSchema, customerDelegationSchema, customerDetailSchema, customerInquiryCategorySchema, customerInquiryListQuerySchema, customerListQuerySchema, customerOrderSchema, customerPointsSchema, customerSortSchema, customerStatsSchema, customerSummarySchema, customerWithdrawalBlockedDetailsSchema, defaultFulfillmentMethodOf, deleteStorefrontFileRequestSchema, deliveryBundleKeyOf, deliveryFeeWaiverSchema, deliveryInfoSchema, deliveryMethodSchema, deliveryStatusSchema, deliveryTypeSchema, descendantCategoryIdsOf, disableStorefrontHostingRequestSchema, discountRequestSchema, discountSchema, dispatchRequestSchema, easyPayProviderResponseSchema, easyPayProviderSchema, eventTypeSchema, exchangeAuthorizationCode, flowActionRequestSchema, flowActionResultSchema, flowActionSchema, flowAssignmentRuleSchema, flowFieldValueSchema, flowInputFieldSchema, flowNotificationWebhookEventDataSchema, flowNotificationWebhookEventSchema, flowPresetSummarySchema, flowSecretNameSchema, flowSecretSchema, flowStateSchema, formatOrderNo, fulfillBulkRequestSchema, fulfillRequestSchema, fulfillmentMethodOf, fulfillmentMethodSchema, fulfillmentMethodsOf, fulfillmentRuleOf, fulfillmentTypeOf, fulfillmentTypeResponseSchema, fulfillmentTypeSchema, holdOrderItemRequestSchema, inquiryListQuerySchema, inquirySchema, inquiryWebhookEventDataSchema, inquiryWebhookEventSchema, inventoryModeSchema, invitationDeliveryStatusSchema, invitationListQuerySchema, invitationSchema, inviteMemberRequestSchema, isCouponTargetLine, isEditableStorefrontPath, isReservedStoreCode, isReservedStorefrontSlug, isShowcaseStorefrontSlug, isStoreScope, isWebOrigin, issueCouponRequestSchema, issueCouponResultSchema, liveGateConditionCodeSchema, liveGateConditionSchema, liveGateErrorDetailsSchema, liveGateSchema, loginProviderSchema, loginProviderStatusSchema, loginProviderTestSchema, loginSettingsSchema, maskedSecretSchema, matchesCollectionRules, mcpRuleResultSchema, mcpToolEventSchema, moveStorefrontFileRequestSchema, myAccountSchema, myStoreSchema, nightsOf, normalizeBusinessNumber, normalizeCouponCode, normalizeStorefrontHostname, normalizeStorefrontPath, oauthTokenResponseSchema, openFulfillmentUnion, optionGroupKindSchema, optionGroupRequestSchema, optionGroupSchema, optionModelRequestSchema, optionModelSchema, optionSelectionSchema, optionSortSchema, optionValueRequestSchema, optionValueSchema, orderCanceledWebhookEventDataSchema, orderCanceledWebhookEventSchema, orderDiscountSchema, orderFulfilledWebhookEventDataSchema, orderFulfilledWebhookEventSchema, orderItemFlowSchema, orderItemFulfillmentSchema, orderItemFulfillmentSnapshotResponseSchema, orderItemFulfillmentSnapshotSchema, orderItemListQuerySchema, orderItemMemoResultSchema, orderItemPageSchema, orderItemSchema, orderItemStatusSchema, orderListQuerySchema, orderSchema, orderSummaryPageSchema, orderSummarySchema, orderWebhookEventDataSchema, orderWebhookEventSchema, pageInfoSchema, pageQueryShape, pageSchema, parseOrderNo, parseWebhookEvent, paymentAttemptRecordSchema, paymentAttemptStatusSchema, paymentCredentialSetSchema, paymentFailureWarningSchema, paymentListQuerySchema, paymentProviderSchema, paymentProviderVerificationSchema, paymentRecordDetailSchema, paymentRecordPageSchema, paymentRecordSchema, paymentRecordStatusSchema, paymentRefundRecordSchema, paymentSettingsSchema, pgEnvironmentSchema, pgPaymentMethodSchema, pgProviderSchema, pgVerificationResultSchema, pickupLocationRequestSchema, pickupLocationSchema, pickupLocationSnapshotSchema, planCodeSchema, planEntitlementsSchema, planErrorDetailsSchema, pointAdjustmentRequestSchema, pointAdjustmentResultSchema, pointEarnOf, pointEarnRateBpSchema, pointEarningEnabled, pointEntrySchema, pointExpiresAtOf, pointHistoryQuerySchema, pointLotSchema, pointPolicyNoticeSchema, pointPolicySchema, pointRestoreExpiresAtOf, pointUseOf, pointUsePolicySchema, policyDocumentUrlSchema, policyVersionSchema, portOneChannelSchema, portOneCredentialsInputSchema, productCreateRequestSchema, productFulfillmentCreateSchema, productFulfillmentResponseSchema, productFulfillmentSchema, productFulfillmentUpdateSchema, productImageRejection, productImageUrlSchema, productListQuerySchema, productOutOfStockWebhookEventDataSchema, productOutOfStockWebhookEventSchema, productPatchRequestSchema, productRefundPolicyOverride, productRefundPolicyPatchSchema, productReplaceRequestSchema, productSchema, productSortSchema, productStatusSchema, productSummarySchema, productVariantRequestSchema, productVariantSchema, proratedPaidRefundBase, proratedPointRefund, proratedRefundBase, publicPlanSchema, publicPlansSchema, publishStorefrontVersionRequestSchema, purchaseDecisionExtendResultSchema, purchaseDecisionRequestResultSchema, purchaseEarnPolicySchema, purchaseEarnRateOf, quoteDelivery, quotePricing, rankBestSelling, refreshUserToken, refundPolicyPatchSchema, refundPolicySchema, rejectClaimRequestSchema, remoteAreaLabelOf, remoteAreaOf, remoteAreaSchema, remoteSurchargeOf, replaceStorefrontSourceRequestSchema, requiresCollection, requiresShipping, resolvePointPolicy, resolveRefundPolicy, resolveShippingPolicy, resolvedFlowSchema, responsePlanCodeSchema, responsePointEntryTypeSchema, reviewListQuerySchema, reviewReportResultSchema, reviewRewardPointOf, reviewRewardPolicySchema, reviewSchema, reviewSortSchema, reviewWebhookEventDataSchema, reviewWebhookEventSchema, rollbackStorefrontRequestSchema, runStorefrontCheckRequestSchema, salesReportGroupBySchema, salesReportQuerySchema, salesReportRowSchema, salesReportSchema, salesTotalsSchema, saveFlowAssignmentRulesRequestSchema, saveFlowDraftRequestSchema, saveFlowSecretRequestSchema, saveLoginProviderRequestSchema, savedCustomInputRequestSchema, savedCustomInputSchema, savedOptionGroupRequestSchema, savedOptionGroupSchema, savedOptionSetCompositionSchema, savedOptionSetFromProductRequestSchema, savedOptionSetFromProductResultSchema, savedOptionSetListQuerySchema, savedOptionSetRequestSchema, savedOptionSetSchema, savedOptionSetSortSchema, savedOptionValueRequestSchema, savedOptionValueSchema, scopeAccessSchema, searchStorefrontFilesRequestSchema, sellerAddressListQuerySchema, sellerAddressRequestSchema, sellerAddressSchema, sellerCustomerInquirySchema, setCalendarRequestSchema, setStorefrontVisibilityRequestSchema, settleCouponShortfall, settlementDetailQuerySchema, settlementDetailSchema, settlementListQuerySchema, settlementStatusSchema, settlementSummarySchema, settlementWithDetailsSchema, shippingAddressSchema, shippingPolicyPatchSchema, shippingPolicySchema, splitRefund, stayRangeSchema, staySnapshotSchema, storeCodeSchema, storeMemberRoleUpdatedSchema, storeMemberSchema, storePointPolicySchema, storeRoleSchema, storeSchema, storeScopeResourceSchema, storeSubscriptionSchema, storefrontBuildDependenciesSchema, storefrontBuildListQuerySchema, storefrontBuildSchema, storefrontBuildStatusSchema, storefrontCheckSchema, storefrontCheckStatusSchema, storefrontCustomDomainStatusSchema, storefrontCustomHostnameProblem, storefrontDependencyFindingSchema, storefrontDeploymentLogSchema, storefrontDeploymentSchema, storefrontDeploymentStepSchema, storefrontDnsRecordSchema, storefrontDomainSchema, storefrontDomainTxtNameOf, storefrontEditPreviewLabelOf, storefrontEditPreviewSchema, storefrontEditSessionSchema, storefrontEditSessionStatusSchema, storefrontEditingSchema, storefrontFileConflictDetailsSchema, storefrontFileContentQuerySchema, storefrontFileContentSchema, storefrontFileDeleteResultSchema, storefrontFileEncodingSchema, storefrontFileEntrySchema, storefrontFileHashSchema, storefrontFileListQuerySchema, storefrontFileListSchema, storefrontFileMoveResultSchema, storefrontFilePathSchema, storefrontFileSearchResultSchema, storefrontFileWriteResultSchema, storefrontHostingSchema, storefrontPreviewLinkSchema, storefrontProvisioningSchema, storefrontRuleResultSchema, storefrontRuleSeveritySchema, storefrontSiteDomainSchema, storefrontSiteDomainsSchema, storefrontSiteSchema, storefrontSiteStatusSchema, storefrontSlugAvailabilityQuerySchema, storefrontSlugAvailabilitySchema, storefrontSlugSchema, storefrontSourceArchivePartSchema, storefrontSourceArchiveQuerySchema, storefrontSourceBlobsResultSchema, storefrontSourceModeSchema, storefrontSourceRefSchema, storefrontSourceReplacedSchema, storefrontSourceSchema, storefrontSuspensionSchema, storefrontTemplateSchema, storefrontVerifyReportSchema, storefrontVersionCreatedSchema, storefrontVersionSchema, storefrontVersionStatusSchema, storefrontVisibilitySchema, subscriptionLimitsSchema, subscriptionStatusSchema, subscriptionUsageSchema, testFlowAssignmentRequestSchema, tossPaymentsCredentialsInputSchema, trackingStageResponseSchema, trackingUpdateResultSchema, unknownWebhookEventSchema, updateCouponRequestSchema, updateLoginProviderRequestSchema, updateLoginSettingsRequestSchema, updateMemberRoleRequestSchema, updatePaymentProviderRequestSchema, updatePaymentSettingsRequestSchema, updatePointPolicyRequestSchema, updateStoreRequestSchema, uploadExtensionOf, uploadPurposeSchema, uploadRejection, uploadRequestSchema, uploadStorefrontSourceBlobsRequestSchema, uploadTicketSchema, upsertPortOneProviderRequestSchema, upsertTossPaymentsProviderRequestSchema, variantStockRequestSchema, variantStockSchema, verifyPaymentProviderRequestSchema, webhookCreatedSchema, webhookDeliveryDetailSchema, webhookDeliveryErrorCodeSchema, webhookDeliveryListQuerySchema, webhookDeliveryResourceSchema, webhookDeliverySchema, webhookDeliveryStatusSchema, webhookEventSchema, webhookFailureReasonSchema, webhookRedeliverFailedResultSchema, webhookRequestHeaderSchema, webhookRequestSchema, webhookResourceTypeSchema, webhookSchema, webhookSecretRotatedSchema, webhookStatusSchema, webhookTestRequestSchema, webhookTestResultSchema, withdrawCustomerRequestSchema, writeDryRunResultSchema, writePreviewSchema, writeStorefrontFilesRequestSchema };
|