@sayren/store-sdk 0.20.0 → 0.22.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 +1485 -24
- package/dist/index.mjs +974 -383
- package/package.json +1 -1
- package/src/client.ts +112 -0
- package/src/index.ts +1 -0
- package/src/schemas/order.ts +15 -0
- package/src/schemas/product.ts +234 -7
- package/src/schemas/promotion.ts +3 -1
- package/src/schemas/saved-option-set.ts +168 -0
- package/src/schemas/storefront-hosting.ts +487 -4
- package/src/schemas/webhook-event.ts +19 -1
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type PageParams, pageQueryShape } from "./common";
|
|
3
|
+
import {
|
|
4
|
+
MAX_ADDON_GROUPS,
|
|
5
|
+
MAX_CUSTOM_INPUT_LENGTH,
|
|
6
|
+
MAX_CUSTOM_INPUTS,
|
|
7
|
+
MAX_OPTION_GROUPS,
|
|
8
|
+
MAX_VALUES_PER_GROUP,
|
|
9
|
+
optionSortSchema,
|
|
10
|
+
} from "./product";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* 저장 옵션 (이슈 #59) — 자주 쓰는 옵션 구성을 이름 붙여 두고 상품 등록에서 불러온다.
|
|
14
|
+
*
|
|
15
|
+
* **불러오기는 복사다.** 저장 옵션을 고치거나 지워도 이미 불러온 상품의 옵션은 그대로다. 재고·SKU·사용 여부는 상품마다
|
|
16
|
+
* 달라 저장하지 않는다. 추가금은 조합별이 아니라 **값별**로 둔다 — 조합 옵션으로 불러오면 조합 추가금은 고른 값 추가금의 합이다.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/** 스토어당 저장 옵션 최대 개수 */
|
|
20
|
+
export const MAX_SAVED_OPTION_SETS = 200;
|
|
21
|
+
/** 저장 옵션 이름 최대 글자 수 */
|
|
22
|
+
export const MAX_SAVED_OPTION_SET_NAME = 50;
|
|
23
|
+
|
|
24
|
+
/** 옵션명 방식 — `combination`(조합: 값의 조합이 판매 단위가 된다)·`addon`(추가 선택: 재고 없이 추가금만) */
|
|
25
|
+
export const optionGroupKindSchema = z.enum(["combination", "addon"]);
|
|
26
|
+
|
|
27
|
+
export type OptionGroupKind = z.infer<typeof optionGroupKindSchema>;
|
|
28
|
+
|
|
29
|
+
const nameSchema = z.string().trim().min(1).max(50);
|
|
30
|
+
|
|
31
|
+
export const savedOptionValueSchema = z.object({
|
|
32
|
+
name: z.string(),
|
|
33
|
+
additionalPrice: z.number().int().describe("값별 추가금(원, 0 이상)"),
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
export const savedOptionGroupSchema = z.object({
|
|
37
|
+
name: z.string(),
|
|
38
|
+
kind: z
|
|
39
|
+
.string()
|
|
40
|
+
.describe(
|
|
41
|
+
"옵션명 방식. 현재 값은 `combination`·`addon`이고 값이 추가될 수 있어 문자열로 받는다",
|
|
42
|
+
),
|
|
43
|
+
required: z.boolean().describe("추가 선택을 구매자가 꼭 고르는가. 조합 옵션명은 항상 false다"),
|
|
44
|
+
values: z.array(savedOptionValueSchema),
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
export type SavedOptionGroup = z.infer<typeof savedOptionGroupSchema>;
|
|
48
|
+
|
|
49
|
+
export const savedCustomInputSchema = z.object({
|
|
50
|
+
label: z.string(),
|
|
51
|
+
placeholder: z.string().nullable(),
|
|
52
|
+
maxLength: z.number().int(),
|
|
53
|
+
required: z.boolean(),
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
export type SavedCustomInput = z.infer<typeof savedCustomInputSchema>;
|
|
57
|
+
|
|
58
|
+
export const savedOptionSetSchema = z.object({
|
|
59
|
+
optionSetId: z.string(),
|
|
60
|
+
name: z.string(),
|
|
61
|
+
optionSort: optionSortSchema,
|
|
62
|
+
groups: z.array(savedOptionGroupSchema).describe("옵션명. 배열 순서가 입력 순서다"),
|
|
63
|
+
customInputs: z.array(savedCustomInputSchema),
|
|
64
|
+
importedProductCount: z
|
|
65
|
+
.number()
|
|
66
|
+
.int()
|
|
67
|
+
.describe("이 저장 옵션을 불러온 상품 수(중복 없이, 지운 상품 제외). 불러오기 기록으로 센다"),
|
|
68
|
+
createdAt: z.string(),
|
|
69
|
+
updatedAt: z.string(),
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
export type SavedOptionSet = z.infer<typeof savedOptionSetSchema>;
|
|
73
|
+
|
|
74
|
+
export const savedOptionValueRequestSchema = z.object({
|
|
75
|
+
name: nameSchema,
|
|
76
|
+
additionalPrice: z.number().int().min(0).default(0),
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
export const savedOptionGroupRequestSchema = z.object({
|
|
80
|
+
name: nameSchema,
|
|
81
|
+
kind: optionGroupKindSchema,
|
|
82
|
+
required: z
|
|
83
|
+
.boolean()
|
|
84
|
+
.default(false)
|
|
85
|
+
.describe("추가 선택만 쓴다. 조합 옵션명에 true를 주면 400이다"),
|
|
86
|
+
values: z.array(savedOptionValueRequestSchema).min(1).max(MAX_VALUES_PER_GROUP),
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
export type SavedOptionGroupRequest = z.infer<typeof savedOptionGroupRequestSchema>;
|
|
90
|
+
|
|
91
|
+
export const savedCustomInputRequestSchema = z.object({
|
|
92
|
+
label: z.string().trim().min(1).max(30),
|
|
93
|
+
placeholder: z.string().trim().max(100).nullish(),
|
|
94
|
+
maxLength: z.number().int().min(1).max(MAX_CUSTOM_INPUT_LENGTH),
|
|
95
|
+
required: z.boolean().default(false),
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* 저장 옵션 만들기·수정 본문. 조합 옵션명은 최대 `MAX_OPTION_GROUPS`개, 추가 선택은 최대 `MAX_ADDON_GROUPS`개이고
|
|
100
|
+
* 옵션명과 직접 입력 항목이 모두 비면 400이다. 수정(PUT)은 통째로 바꾼다.
|
|
101
|
+
*/
|
|
102
|
+
export const savedOptionSetRequestSchema = z.object({
|
|
103
|
+
name: z.string().trim().min(1).max(MAX_SAVED_OPTION_SET_NAME),
|
|
104
|
+
optionSort: optionSortSchema.default("REGISTERED"),
|
|
105
|
+
groups: z
|
|
106
|
+
.array(savedOptionGroupRequestSchema)
|
|
107
|
+
.max(MAX_OPTION_GROUPS + MAX_ADDON_GROUPS)
|
|
108
|
+
.default([]),
|
|
109
|
+
customInputs: z.array(savedCustomInputRequestSchema).max(MAX_CUSTOM_INPUTS).default([]),
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
export type SavedOptionSetRequest = z.infer<typeof savedOptionSetRequestSchema>;
|
|
113
|
+
export type SavedOptionSetRequestInput = z.input<typeof savedOptionSetRequestSchema>;
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* 상품에서 저장 (`POST /v1/saved-option-sets/from-product`) — 상품의 현재 옵션을 저장 옵션으로 만든다.
|
|
117
|
+
*
|
|
118
|
+
* 조합 추가금이 값별 추가금의 합으로 되돌려지면 값별로 저장하고, 조합마다 제각각이면 추가금을 빼고
|
|
119
|
+
* 응답 `additionalPriceDropped: true`로 알린다. `replaceOptionSetId`를 주면 그 저장 옵션을 덮어쓴다(이름 중복의 덮어쓰기).
|
|
120
|
+
*/
|
|
121
|
+
export const savedOptionSetFromProductRequestSchema = z.object({
|
|
122
|
+
productId: z.string(),
|
|
123
|
+
name: z.string().trim().min(1).max(MAX_SAVED_OPTION_SET_NAME),
|
|
124
|
+
includeOptions: z.boolean().default(true).describe("옵션명(조합·추가 선택)을 저장하는가"),
|
|
125
|
+
includeCustomInputs: z.boolean().default(true).describe("직접 입력 항목을 저장하는가"),
|
|
126
|
+
replaceOptionSetId: z.string().optional().describe("덮어쓸 저장 옵션 id. 생략하면 새로 만든다"),
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
export type SavedOptionSetFromProductRequest = z.infer<
|
|
130
|
+
typeof savedOptionSetFromProductRequestSchema
|
|
131
|
+
>;
|
|
132
|
+
export type SavedOptionSetFromProductRequestInput = z.input<
|
|
133
|
+
typeof savedOptionSetFromProductRequestSchema
|
|
134
|
+
>;
|
|
135
|
+
|
|
136
|
+
export const savedOptionSetFromProductResultSchema = z.object({
|
|
137
|
+
optionSet: savedOptionSetSchema,
|
|
138
|
+
additionalPriceDropped: z
|
|
139
|
+
.boolean()
|
|
140
|
+
.describe("조합 추가금을 값별 추가금으로 되돌릴 수 없어 추가금을 빼고 저장했는가"),
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
export type SavedOptionSetFromProductResult = z.infer<typeof savedOptionSetFromProductResultSchema>;
|
|
144
|
+
|
|
145
|
+
/** 구성 필터 — 조합 옵션명·추가 선택 옵션명·직접 입력 항목을 가진 저장 옵션 */
|
|
146
|
+
export const savedOptionSetCompositionSchema = z.enum(["combination", "addon", "customInput"]);
|
|
147
|
+
|
|
148
|
+
export const savedOptionSetSortSchema = z.enum([
|
|
149
|
+
"updatedAt.desc",
|
|
150
|
+
"name.asc",
|
|
151
|
+
"importedProductCount.desc",
|
|
152
|
+
]);
|
|
153
|
+
|
|
154
|
+
export type SavedOptionSetSort = z.infer<typeof savedOptionSetSortSchema>;
|
|
155
|
+
|
|
156
|
+
export interface SavedOptionSetListParams extends PageParams {
|
|
157
|
+
keyword?: string;
|
|
158
|
+
composition?: z.infer<typeof savedOptionSetCompositionSchema>;
|
|
159
|
+
sort?: SavedOptionSetSort;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** `GET /v1/saved-option-sets` 쿼리 — OpenAPI 문서용 형태(값은 쿼리 문자열) */
|
|
163
|
+
export const savedOptionSetListQuerySchema = z.object({
|
|
164
|
+
keyword: z.string().optional().describe("이름 검색 (포함, 대소문자 무시)"),
|
|
165
|
+
composition: savedOptionSetCompositionSchema.optional().describe("구성 필터"),
|
|
166
|
+
sort: savedOptionSetSortSchema.optional().describe("정렬 (기본 updatedAt.desc)"),
|
|
167
|
+
...pageQueryShape({ defaultSize: 20, maxSize: 200 }),
|
|
168
|
+
});
|