@sayren/store-sdk 0.34.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 CHANGED
@@ -166,8 +166,8 @@ export declare const auditLogPageSchema: z.ZodObject<{
166
166
  export type AuditLogPage = z.infer<typeof auditLogPageSchema>;
167
167
  export declare const agentPolicyDecisionSchema: z.ZodEnum<{
168
168
  DENIED: "DENIED";
169
- APPROVAL_REQUIRED: "APPROVAL_REQUIRED";
170
169
  ALLOW: "ALLOW";
170
+ APPROVAL_REQUIRED: "APPROVAL_REQUIRED";
171
171
  }>;
172
172
  export type AgentPolicyDecision = z.infer<typeof agentPolicyDecisionSchema>;
173
173
  export declare const writePreviewSchema: z.ZodObject<{
@@ -192,8 +192,8 @@ export declare const writeDryRunResultSchema: z.ZodObject<{
192
192
  dryRun: z.ZodLiteral<true>;
193
193
  decision: z.ZodEnum<{
194
194
  DENIED: "DENIED";
195
- APPROVAL_REQUIRED: "APPROVAL_REQUIRED";
196
195
  ALLOW: "ALLOW";
196
+ APPROVAL_REQUIRED: "APPROVAL_REQUIRED";
197
197
  }>;
198
198
  reason: z.ZodNullable<z.ZodString>;
199
199
  preview: z.ZodObject<{
@@ -5610,6 +5610,27 @@ export declare const categoryDeleteQuerySchema: z.ZodObject<{
5610
5610
  cascade: "cascade";
5611
5611
  }>>;
5612
5612
  }, z.core.$strip>;
5613
+ /**
5614
+ * 카테고리 번역 (이슈 #134) — 언어 하나의 이름·SEO. 카테고리 필드(`name`·`meta*`)는 상점 기본 언어 값이고 번역 레코드가 언어별 값이다.
5615
+ * 비운 칸(null)은 스토어프론트가 기본 언어 값으로 대체한다(칸 단위 대체).
5616
+ */
5617
+ export declare const categoryLocalizationSchema: z.ZodObject<{
5618
+ locale: z.ZodString;
5619
+ name: z.ZodNullable<z.ZodString>;
5620
+ metaTitle: z.ZodNullable<z.ZodString>;
5621
+ metaDescription: z.ZodNullable<z.ZodString>;
5622
+ metaKeywords: z.ZodNullable<z.ZodString>;
5623
+ updatedAt: z.ZodString;
5624
+ }, z.core.$strip>;
5625
+ export type CategoryLocalization = z.infer<typeof categoryLocalizationSchema>;
5626
+ /** `PUT /v1/categories/{categoryId}/localizations/{locale}` 본문 — 레코드 전체를 바꾼다. 빠진 칸은 null(기본 언어 값으로 대체)이다 */
5627
+ export declare const categoryLocalizationRequestSchema: z.ZodObject<{
5628
+ name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
5629
+ metaTitle: z.ZodOptional<z.ZodNullable<z.ZodString>>;
5630
+ metaDescription: z.ZodOptional<z.ZodNullable<z.ZodString>>;
5631
+ metaKeywords: z.ZodOptional<z.ZodNullable<z.ZodString>>;
5632
+ }, z.core.$strict>;
5633
+ export type CategoryLocalizationRequest = z.infer<typeof categoryLocalizationRequestSchema>;
5613
5634
  //#endregion
5614
5635
  //#region src/schemas/common.d.ts
5615
5636
  export declare const pageInfoSchema: z.ZodObject<{
@@ -8123,6 +8144,7 @@ export declare const marketSchema: z.ZodObject<{
8123
8144
  couponsEnabled: z.ZodBoolean;
8124
8145
  pointsEnabled: z.ZodBoolean;
8125
8146
  archivedAt: z.ZodNullable<z.ZodString>;
8147
+ locales: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
8126
8148
  }, z.core.$strip>;
8127
8149
  export type Market = z.infer<typeof marketSchema>;
8128
8150
  export declare const createMarketRequestSchema: z.ZodObject<{
@@ -8149,6 +8171,7 @@ export declare const createMarketRequestSchema: z.ZodObject<{
8149
8171
  domains: z.ZodOptional<z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>>;
8150
8172
  couponsEnabled: z.ZodOptional<z.ZodBoolean>;
8151
8173
  pointsEnabled: z.ZodOptional<z.ZodBoolean>;
8174
+ locales: z.ZodOptional<z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>>;
8152
8175
  }, z.core.$strict>;
8153
8176
  export type CreateMarketRequest = z.infer<typeof createMarketRequestSchema>;
8154
8177
  export type CreateMarketRequestInput = z.input<typeof createMarketRequestSchema>;
@@ -8158,6 +8181,7 @@ export declare const updateMarketRequestSchema: z.ZodObject<{
8158
8181
  domains: z.ZodOptional<z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>>;
8159
8182
  couponsEnabled: z.ZodOptional<z.ZodBoolean>;
8160
8183
  pointsEnabled: z.ZodOptional<z.ZodBoolean>;
8184
+ locales: z.ZodOptional<z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>>;
8161
8185
  }, z.core.$strict>;
8162
8186
  export type UpdateMarketRequest = z.infer<typeof updateMarketRequestSchema>;
8163
8187
  export type UpdateMarketRequestInput = z.input<typeof updateMarketRequestSchema>;
@@ -9050,6 +9074,7 @@ export declare const orderSchema: z.ZodObject<{
9050
9074
  }, z.core.$strip>;
9051
9075
  currency: z.ZodOptional<z.ZodString>;
9052
9076
  testPayment: z.ZodBoolean;
9077
+ locale: z.ZodOptional<z.ZodNullable<z.ZodString>>;
9053
9078
  items: z.ZodArray<z.ZodObject<{
9054
9079
  orderItemId: z.ZodString;
9055
9080
  orderItemNo: z.ZodDefault<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
@@ -9320,7 +9345,7 @@ export declare const orderItemPageSchema: z.ZodObject<{
9320
9345
  export type OrderItemPage = z.infer<typeof orderItemPageSchema>;
9321
9346
  /**
9322
9347
  * `GET /v1/orders` 쿼리 — OpenAPI 문서용 형태(값은 쿼리 문자열). 검증 규칙은 서버가 적용한다:
9323
- * `orderNo` 없이 `orderedFrom` 누락 400 `MISSING_PARAMETER`, 날짜·`orderNo` 형식 오류 400 `INVALID_PARAMETER`, 31일 초과 400 `RANGE_TOO_WIDE`,
9348
+ * `orderNo` 없이 `orderedFrom` 누락 400 `MISSING_PARAMETER`, 날짜·`orderNo` 형식 오류 400 `INVALID_PARAMETER`, 366일 초과 400 `RANGE_TOO_WIDE`,
9324
9349
  * `testPayment`가 `true`·`false`가 아니면 400 `INVALID_PARAMETER`
9325
9350
  */
9326
9351
  export declare const orderListQuerySchema: z.ZodObject<{
@@ -12672,9 +12697,9 @@ export type ProductPatchRequest = z.infer<typeof productPatchRequestSchema>;
12672
12697
  export declare const productSortSchema: z.ZodEnum<{
12673
12698
  "createdAt.desc": "createdAt.desc";
12674
12699
  "createdAt.asc": "createdAt.asc";
12675
- "updatedAt.desc": "updatedAt.desc";
12676
12700
  "salePrice.asc": "salePrice.asc";
12677
12701
  "salePrice.desc": "salePrice.desc";
12702
+ "updatedAt.desc": "updatedAt.desc";
12678
12703
  }>;
12679
12704
  export type ProductSort = z.infer<typeof productSortSchema>;
12680
12705
  export interface ProductListParams extends PageParams {
@@ -12703,9 +12728,9 @@ export declare const productListQuerySchema: z.ZodObject<{
12703
12728
  sort: z.ZodOptional<z.ZodEnum<{
12704
12729
  "createdAt.desc": "createdAt.desc";
12705
12730
  "createdAt.asc": "createdAt.asc";
12706
- "updatedAt.desc": "updatedAt.desc";
12707
12731
  "salePrice.asc": "salePrice.asc";
12708
12732
  "salePrice.desc": "salePrice.desc";
12733
+ "updatedAt.desc": "updatedAt.desc";
12709
12734
  }>>;
12710
12735
  }, z.core.$strip>;
12711
12736
  export declare const discountRequestSchema: z.ZodObject<{
@@ -12860,6 +12885,75 @@ export declare const infoSectionRequestSchema: z.ZodObject<{
12860
12885
  export type InfoSectionRequest = z.infer<typeof infoSectionRequestSchema>;
12861
12886
  export type InfoSectionRequestInput = z.input<typeof infoSectionRequestSchema>;
12862
12887
  //#endregion
12888
+ //#region src/schemas/product-localization.d.ts
12889
+ /**
12890
+ * 조회 응답 — 지금 상품의 옵션명·값·직접 입력 항목을 모두 싣고 번역하지 않은 칸은 null이다.
12891
+ * `optionGroups`는 조합 옵션, `addonGroups`는 추가 선택이다(상품 응답과 같은 구분)
12892
+ */
12893
+ export declare const productLocalizationSchema: z.ZodObject<{
12894
+ locale: z.ZodString;
12895
+ name: z.ZodNullable<z.ZodString>;
12896
+ description: z.ZodNullable<z.ZodString>;
12897
+ descriptionJson: z.ZodNullable<z.ZodString>;
12898
+ images: z.ZodNullable<z.ZodArray<z.ZodString>>;
12899
+ optionGroups: z.ZodArray<z.ZodObject<{
12900
+ groupId: z.ZodString;
12901
+ name: z.ZodNullable<z.ZodString>;
12902
+ values: z.ZodArray<z.ZodObject<{
12903
+ valueId: z.ZodString;
12904
+ name: z.ZodNullable<z.ZodString>;
12905
+ }, z.core.$strip>>;
12906
+ }, z.core.$strip>>;
12907
+ addonGroups: z.ZodArray<z.ZodObject<{
12908
+ groupId: z.ZodString;
12909
+ name: z.ZodNullable<z.ZodString>;
12910
+ values: z.ZodArray<z.ZodObject<{
12911
+ valueId: z.ZodString;
12912
+ name: z.ZodNullable<z.ZodString>;
12913
+ }, z.core.$strip>>;
12914
+ }, z.core.$strip>>;
12915
+ customInputs: z.ZodArray<z.ZodObject<{
12916
+ inputId: z.ZodString;
12917
+ label: z.ZodNullable<z.ZodString>;
12918
+ placeholder: z.ZodNullable<z.ZodString>;
12919
+ }, z.core.$strip>>;
12920
+ updatedAt: z.ZodString;
12921
+ }, z.core.$strip>;
12922
+ export type ProductLocalization = z.infer<typeof productLocalizationSchema>;
12923
+ /**
12924
+ * `PUT /v1/products/{productId}/localizations/{locale}` 본문 — 레코드 전체를 바꾼다. 빠진 칸은 null(기본 언어 값으로 대체)이다.
12925
+ * 옵션은 번역할 id만 보낸다. 상품에 없는 id는 400 `PRODUCT_LOCALIZATION_TARGET_NOT_FOUND`다.
12926
+ * 번역한 옵션명·값 이름도 기본 언어와 같은 규칙(대소문자·앞뒤 공백 무시 유일)이고 겹치면 400 `INVALID_OPTION_MODEL`이다
12927
+ */
12928
+ export declare const productLocalizationRequestSchema: z.ZodObject<{
12929
+ name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
12930
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
12931
+ descriptionJson: z.ZodOptional<z.ZodNullable<z.ZodString>>;
12932
+ images: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodURL>>>;
12933
+ optionGroups: z.ZodOptional<z.ZodArray<z.ZodObject<{
12934
+ groupId: z.ZodString;
12935
+ name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
12936
+ values: z.ZodOptional<z.ZodArray<z.ZodObject<{
12937
+ valueId: z.ZodString;
12938
+ name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
12939
+ }, z.core.$strict>>>;
12940
+ }, z.core.$strict>>>;
12941
+ addonGroups: z.ZodOptional<z.ZodArray<z.ZodObject<{
12942
+ groupId: z.ZodString;
12943
+ name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
12944
+ values: z.ZodOptional<z.ZodArray<z.ZodObject<{
12945
+ valueId: z.ZodString;
12946
+ name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
12947
+ }, z.core.$strict>>>;
12948
+ }, z.core.$strict>>>;
12949
+ customInputs: z.ZodOptional<z.ZodArray<z.ZodObject<{
12950
+ inputId: z.ZodString;
12951
+ label: z.ZodOptional<z.ZodNullable<z.ZodString>>;
12952
+ placeholder: z.ZodOptional<z.ZodNullable<z.ZodString>>;
12953
+ }, z.core.$strict>>>;
12954
+ }, z.core.$strict>;
12955
+ export type ProductLocalizationRequest = z.infer<typeof productLocalizationRequestSchema>;
12956
+ //#endregion
12863
12957
  //#region src/schemas/saved-option-set.d.ts
12864
12958
  /**
12865
12959
  * 저장 옵션 (이슈 #59) — 자주 쓰는 옵션 구성을 이름 붙여 두고 상품 등록에서 불러온다.
@@ -13292,6 +13386,7 @@ export declare const updateStoreRequestSchema: z.ZodObject<{
13292
13386
  privacyVersion: z.ZodOptional<z.ZodString>;
13293
13387
  termsUrl: z.ZodOptional<z.ZodNullable<z.ZodURL>>;
13294
13388
  privacyUrl: z.ZodOptional<z.ZodNullable<z.ZodURL>>;
13389
+ defaultLocale: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
13295
13390
  businessName: z.ZodOptional<z.ZodNullable<z.ZodString>>;
13296
13391
  representativeName: z.ZodOptional<z.ZodNullable<z.ZodString>>;
13297
13392
  businessNumber: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -13376,6 +13471,7 @@ export declare const storeSchema: z.ZodObject<{
13376
13471
  termsUrl: z.ZodNullable<z.ZodString>;
13377
13472
  privacyUrl: z.ZodNullable<z.ZodString>;
13378
13473
  memberCount: z.ZodNumber;
13474
+ defaultLocale: z.ZodDefault<z.ZodOptional<z.ZodString>>;
13379
13475
  createdAt: z.ZodString;
13380
13476
  businessName: z.ZodDefault<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
13381
13477
  representativeName: z.ZodDefault<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
@@ -15703,6 +15799,68 @@ export declare function createStoreClient(options: StoreClientOptions): {
15703
15799
  }>;
15704
15800
  patch: (productId: string, body: ProductPatchRequest) => Promise<void>;
15705
15801
  remove: (productId: string) => Promise<void>;
15802
+ /** 번역(이슈 #134) — 언어별 상품명·상세설명·이미지·옵션 이름 */
15803
+ localizations: {
15804
+ list: (productId: string) => Promise<{
15805
+ locale: string;
15806
+ name: string | null;
15807
+ description: string | null;
15808
+ descriptionJson: string | null;
15809
+ images: string[] | null;
15810
+ optionGroups: {
15811
+ groupId: string;
15812
+ name: string | null;
15813
+ values: {
15814
+ valueId: string;
15815
+ name: string | null;
15816
+ }[];
15817
+ }[];
15818
+ addonGroups: {
15819
+ groupId: string;
15820
+ name: string | null;
15821
+ values: {
15822
+ valueId: string;
15823
+ name: string | null;
15824
+ }[];
15825
+ }[];
15826
+ customInputs: {
15827
+ inputId: string;
15828
+ label: string | null;
15829
+ placeholder: string | null;
15830
+ }[];
15831
+ updatedAt: string;
15832
+ }[]>;
15833
+ put: (productId: string, locale: string, body: ProductLocalizationRequest) => Promise<{
15834
+ locale: string;
15835
+ name: string | null;
15836
+ description: string | null;
15837
+ descriptionJson: string | null;
15838
+ images: string[] | null;
15839
+ optionGroups: {
15840
+ groupId: string;
15841
+ name: string | null;
15842
+ values: {
15843
+ valueId: string;
15844
+ name: string | null;
15845
+ }[];
15846
+ }[];
15847
+ addonGroups: {
15848
+ groupId: string;
15849
+ name: string | null;
15850
+ values: {
15851
+ valueId: string;
15852
+ name: string | null;
15853
+ }[];
15854
+ }[];
15855
+ customInputs: {
15856
+ inputId: string;
15857
+ label: string | null;
15858
+ placeholder: string | null;
15859
+ }[];
15860
+ updatedAt: string;
15861
+ }>;
15862
+ remove: (productId: string, locale: string) => Promise<void>;
15863
+ };
15706
15864
  bulkUpdateStatus: (productIds: string[], status: ProductStatus, idempotencyKey?: string) => Promise<{
15707
15865
  succeeded: string[];
15708
15866
  failed: {
@@ -16571,6 +16729,26 @@ export declare function createStoreClient(options: StoreClientOptions): {
16571
16729
  remove: (categoryId: string, opts?: {
16572
16730
  strategy?: CategoryDeleteStrategy;
16573
16731
  }) => Promise<void>;
16732
+ /** 번역(이슈 #134) — 언어별 이름·SEO */
16733
+ localizations: {
16734
+ list: (categoryId: string) => Promise<{
16735
+ locale: string;
16736
+ name: string | null;
16737
+ metaTitle: string | null;
16738
+ metaDescription: string | null;
16739
+ metaKeywords: string | null;
16740
+ updatedAt: string;
16741
+ }[]>;
16742
+ put: (categoryId: string, locale: string, body: CategoryLocalizationRequest) => Promise<{
16743
+ locale: string;
16744
+ name: string | null;
16745
+ metaTitle: string | null;
16746
+ metaDescription: string | null;
16747
+ metaKeywords: string | null;
16748
+ updatedAt: string;
16749
+ }>;
16750
+ remove: (categoryId: string, locale: string) => Promise<void>;
16751
+ };
16574
16752
  };
16575
16753
  orders: {
16576
16754
  /**
@@ -16740,6 +16918,7 @@ export declare function createStoreClient(options: StoreClientOptions): {
16740
16918
  }[];
16741
16919
  progressStatus?: "PAID" | "CANCELED" | "PAYMENT_WAITING" | "CONFIRMED" | "DISPATCHED" | "DELIVERING" | "DELIVERED" | "PURCHASE_DECIDED" | undefined;
16742
16920
  currency?: string | undefined;
16921
+ locale?: string | null | undefined;
16743
16922
  }>;
16744
16923
  /**
16745
16924
  * `POST /v1/orders/{orderId}/cash-receipt/reissue` — 실패했거나 재시도 대기 중인 현금영수증을 지금 다시 발급·취소한다.
@@ -21987,6 +22166,7 @@ export declare function createStoreClient(options: StoreClientOptions): {
21987
22166
  couponsEnabled: boolean;
21988
22167
  pointsEnabled: boolean;
21989
22168
  archivedAt: string | null;
22169
+ locales: string[];
21990
22170
  }[]>;
21991
22171
  get: (marketId: string) => Promise<{
21992
22172
  marketId: string;
@@ -21998,6 +22178,7 @@ export declare function createStoreClient(options: StoreClientOptions): {
21998
22178
  couponsEnabled: boolean;
21999
22179
  pointsEnabled: boolean;
22000
22180
  archivedAt: string | null;
22181
+ locales: string[];
22001
22182
  }>;
22002
22183
  create: (body: CreateMarketRequestInput) => Promise<{
22003
22184
  marketId: string;
@@ -22009,6 +22190,7 @@ export declare function createStoreClient(options: StoreClientOptions): {
22009
22190
  couponsEnabled: boolean;
22010
22191
  pointsEnabled: boolean;
22011
22192
  archivedAt: string | null;
22193
+ locales: string[];
22012
22194
  }>;
22013
22195
  update: (marketId: string, body: UpdateMarketRequestInput) => Promise<{
22014
22196
  marketId: string;
@@ -22020,6 +22202,7 @@ export declare function createStoreClient(options: StoreClientOptions): {
22020
22202
  couponsEnabled: boolean;
22021
22203
  pointsEnabled: boolean;
22022
22204
  archivedAt: string | null;
22205
+ locales: string[];
22023
22206
  }>;
22024
22207
  archive: (marketId: string) => Promise<void>;
22025
22208
  };
@@ -23621,6 +23804,7 @@ export declare function createStoreClient(options: StoreClientOptions): {
23621
23804
  termsUrl: string | null;
23622
23805
  privacyUrl: string | null;
23623
23806
  memberCount: number;
23807
+ defaultLocale: string;
23624
23808
  createdAt: string;
23625
23809
  businessName: string | null;
23626
23810
  representativeName: string | null;
@@ -23678,6 +23862,7 @@ export declare function createStoreClient(options: StoreClientOptions): {
23678
23862
  termsUrl: string | null;
23679
23863
  privacyUrl: string | null;
23680
23864
  memberCount: number;
23865
+ defaultLocale: string;
23681
23866
  createdAt: string;
23682
23867
  businessName: string | null;
23683
23868
  representativeName: string | null;
@@ -24277,6 +24462,12 @@ export declare const customerDelegationSchema: z.ZodObject<{
24277
24462
  }, z.core.$strip>;
24278
24463
  export type CustomerDelegation = z.infer<typeof customerDelegationSchema>;
24279
24464
  //#endregion
24465
+ //#region src/schemas/locale.d.ts
24466
+ export declare function normalizeLocale(value: string | null | undefined): string | null;
24467
+ /** 상점 기본 언어 — 옛 상점과 언어를 정하지 않은 상점의 값이다 */
24468
+ export declare const DEFAULT_STORE_LOCALE = "ko";
24469
+ export declare const localeCodeSchema: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
24470
+ //#endregion
24280
24471
  //#region src/schemas/promotion.d.ts
24281
24472
  /** 쿠폰 종류 */
24282
24473
  export declare const couponKindSchema: z.ZodEnum<{
package/dist/index.mjs CHANGED
@@ -357,6 +357,36 @@ const myAccountSchema = z.object({
357
357
  createdAt: z.string()
358
358
  });
359
359
  //#endregion
360
+ //#region src/schemas/locale.ts
361
+ /**
362
+ * 언어 코드 (이슈 #134) — BCP 47의 언어[-문자][-지역]까지 받는다(`ko`·`en`·`en-US`·`zh-Hant-TW`).
363
+ * 대소문자는 표준 표기로 맞춘다(언어 소문자, 문자 첫 글자 대문자, 지역 대문자). 맞지 않으면 null이다.
364
+ */
365
+ const LOCALE_PATTERN = /^([a-z]{2,3})(?:-([a-z]{4}))?(?:-([a-z]{2}))?$/;
366
+ function normalizeLocale(value) {
367
+ const match = value?.trim().replace(/_/g, "-").toLowerCase().match(LOCALE_PATTERN);
368
+ if (!match) return null;
369
+ const [, language, script, region] = match;
370
+ return [
371
+ language,
372
+ script ? `${script[0]?.toUpperCase()}${script.slice(1)}` : null,
373
+ region ? region.toUpperCase() : null
374
+ ].filter(Boolean).join("-");
375
+ }
376
+ /** 상점 기본 언어 — 옛 상점과 언어를 정하지 않은 상점의 값이다 */
377
+ const DEFAULT_STORE_LOCALE = "ko";
378
+ const localeCodeSchema = z.string().max(35).transform((value, ctx) => {
379
+ const normalized = normalizeLocale(value);
380
+ if (normalized === null) {
381
+ ctx.addIssue({
382
+ code: "custom",
383
+ message: "언어는 BCP 47 언어 코드입니다(예: ko·en·en-US)"
384
+ });
385
+ return z.NEVER;
386
+ }
387
+ return normalized;
388
+ }).describe("언어(BCP 47, 예: ko·en·en-US·zh-Hant-TW)");
389
+ //#endregion
360
390
  //#region src/schemas/currency.ts
361
391
  const INT4_MAX = 2147483647;
362
392
  /** Stripe 카드 외 결제 상한이 8자리(999,999.99)라 2자리 통화는 이 값이 int4보다 먼저 걸린다 */
@@ -1680,7 +1710,8 @@ const updateStoreRequestSchema = z.object({
1680
1710
  termsVersion: policyVersionSchema.optional().describe("이용약관 버전. 올리면 이 약관에 동의한 구매자에게 재동의를 요구한다(`GET /storefront/v1/me`의 `reconsentRequired`)"),
1681
1711
  privacyVersion: policyVersionSchema.optional().describe("개인정보 수집이용 동의 버전. 올리면 구매자에게 재동의를 요구한다"),
1682
1712
  termsUrl: policyDocumentUrlSchema.optional().describe("이용약관 문서 주소(https). 동의 시점의 값이 동의 이력에 복사된다. `null`을 주면 지운다"),
1683
- privacyUrl: policyDocumentUrlSchema.optional().describe("개인정보 수집이용 동의 문서 주소(https). `null`을 주면 지운다")
1713
+ privacyUrl: policyDocumentUrlSchema.optional().describe("개인정보 수집이용 동의 문서 주소(https). `null`을 주면 지운다"),
1714
+ defaultLocale: localeCodeSchema.optional().describe("상점 기본 언어(이슈 #134). 상품·카테고리 필드가 이 언어 값이고 번역이 없는 칸은 이 값으로 보인다. 바꿔도 저장된 값은 그대로다")
1684
1715
  }).refine((value) => Object.values(value).some((v) => v !== void 0), { message: "최소 1개 필드가 필요합니다" });
1685
1716
  const storeSchema = z.object({
1686
1717
  storeId: z.string(),
@@ -1711,6 +1742,7 @@ const storeSchema = z.object({
1711
1742
  termsUrl: z.string().nullable().describe("이용약관 문서 주소. 정하지 않았으면 null이고 동의 이력에도 주소가 남지 않는다"),
1712
1743
  privacyUrl: z.string().nullable().describe("개인정보 수집이용 동의 문서 주소"),
1713
1744
  memberCount: z.number().int(),
1745
+ defaultLocale: z.string().optional().default("ko").describe("상점 기본 언어(이슈 #134, BCP 47). 서버는 항상 싣는다"),
1714
1746
  createdAt: z.string()
1715
1747
  });
1716
1748
  const storeMemberSchema = z.object({
@@ -6674,6 +6706,25 @@ const categoryListQuerySchema = z.object({
6674
6706
  });
6675
6707
  /** `DELETE /v1/categories/{categoryId}` 쿼리 — OpenAPI 문서용 형태 */
6676
6708
  const categoryDeleteQuerySchema = z.object({ strategy: categoryDeleteStrategySchema.optional().describe("하위 카테고리·연결 상품 처리 방식. 생략하면 둘 중 하나라도 있을 때 409 `CATEGORY_NOT_EMPTY`다. `reparent`는 직계 자식을 삭제할 카테고리의 부모로 옮기고, `cascade`는 서브트리를 삭제하고 연결 상품을 미분류로 둔다") });
6709
+ /**
6710
+ * 카테고리 번역 (이슈 #134) — 언어 하나의 이름·SEO. 카테고리 필드(`name`·`meta*`)는 상점 기본 언어 값이고 번역 레코드가 언어별 값이다.
6711
+ * 비운 칸(null)은 스토어프론트가 기본 언어 값으로 대체한다(칸 단위 대체).
6712
+ */
6713
+ const categoryLocalizationSchema = z.object({
6714
+ locale: z.string().describe("언어(BCP 47)"),
6715
+ name: z.string().nullable().describe("이름. null이면 기본 언어 이름"),
6716
+ metaTitle: z.string().nullable(),
6717
+ metaDescription: z.string().nullable(),
6718
+ metaKeywords: z.string().nullable(),
6719
+ updatedAt: z.string()
6720
+ });
6721
+ /** `PUT /v1/categories/{categoryId}/localizations/{locale}` 본문 — 레코드 전체를 바꾼다. 빠진 칸은 null(기본 언어 값으로 대체)이다 */
6722
+ const categoryLocalizationRequestSchema = z.strictObject({
6723
+ name: z.string().trim().min(1).max(100).nullable().optional(),
6724
+ metaTitle: z.string().max(100).nullable().optional(),
6725
+ metaDescription: z.string().max(300).nullable().optional(),
6726
+ metaKeywords: z.string().max(200).nullable().optional()
6727
+ });
6677
6728
  //#endregion
6678
6729
  //#region src/schemas/collection.ts
6679
6730
  /**
@@ -8629,6 +8680,8 @@ const loginProviderTestSchema = z.object({
8629
8680
  *
8630
8681
  * 스토어프론트는 요청마다 도메인(`X-Storefront-Host`) → 구매자 국가(`X-Buyer-Country`) → 기본 권역 순으로 권역을 고르고, 주문서가 그 권역·통화를 굳힌다.
8631
8682
  * 외화 권역은 적립금을 켤 수 없다(적립금은 기본 통화 단위다).
8683
+ *
8684
+ * 권역은 언어도 정한다(이슈 #134). `locales`는 이 권역 스토어프론트가 내는 언어이고 첫 언어가 대표 언어다. 비어 있으면 상점 기본 언어 하나다.
8632
8685
  */
8633
8686
  const countryCodeSchema = z.string().regex(/^[A-Za-z]{2}$/, "국가는 ISO 3166-1 alpha-2 두 글자입니다").transform((value) => value.toUpperCase()).describe("국가(ISO 3166-1 alpha-2, 예: KR·US·JP)");
8634
8687
  const hostnameSchema = z.string().min(1).max(253).regex(/^[A-Za-z0-9.-]+$/, "도메인은 호스트 이름만 입력합니다(예: shop.example.com)").transform((value) => value.toLowerCase().replace(/\.$/, "")).describe("연결 도메인(호스트 이름). 셀러가 직접 호스팅하는 스토어프론트가 `X-Storefront-Host`로 보낸다");
@@ -8641,7 +8694,8 @@ const marketSchema = z.object({
8641
8694
  domains: z.array(z.string()).describe("이 권역에 연결한 도메인"),
8642
8695
  couponsEnabled: z.boolean().describe("이 권역 주문서에서 쿠폰을 쓸 수 있는가"),
8643
8696
  pointsEnabled: z.boolean().describe("이 권역 주문서에서 적립금을 쓸 수 있는가. 외화 권역은 늘 false다"),
8644
- archivedAt: z.string().nullable().describe("보관 시각. 보관한 권역은 판정에서 빠지고 그 국가·도메인은 풀린다")
8697
+ archivedAt: z.string().nullable().describe("보관 시각. 보관한 권역은 판정에서 빠지고 그 국가·도메인은 풀린다"),
8698
+ locales: z.array(z.string()).optional().default([]).describe("이 권역 언어(이슈 #134). 첫 언어가 대표 언어다. 비어 있으면 상점 기본 언어 하나다. 서버는 항상 싣는다")
8645
8699
  });
8646
8700
  const createMarketRequestSchema = z.strictObject({
8647
8701
  name: z.string().trim().min(1).max(50),
@@ -8649,14 +8703,16 @@ const createMarketRequestSchema = z.strictObject({
8649
8703
  countries: z.array(countryCodeSchema).min(1).max(250),
8650
8704
  domains: z.array(hostnameSchema).max(20).optional(),
8651
8705
  couponsEnabled: z.boolean().optional().describe("기본 false"),
8652
- pointsEnabled: z.boolean().optional().describe("기본 false. 외화 권역은 true로 둘 수 없다")
8706
+ pointsEnabled: z.boolean().optional().describe("기본 false. 외화 권역은 true로 둘 수 없다"),
8707
+ locales: z.array(localeCodeSchema).max(20).optional().describe("이 권역 언어(이슈 #134). 주면 목록 전체를 바꾼다. 첫 언어가 대표 언어다. 비우면 상점 기본 언어 하나다")
8653
8708
  });
8654
8709
  const updateMarketRequestSchema = z.strictObject({
8655
8710
  name: z.string().trim().min(1).max(50).optional(),
8656
8711
  countries: z.array(countryCodeSchema).max(250).optional().describe("주면 국가 목록 전체를 바꾼다. 다른 권역의 국가는 그 권역에서 먼저 빼야 한다"),
8657
8712
  domains: z.array(hostnameSchema).max(20).optional().describe("주면 도메인 목록 전체를 바꾼다"),
8658
8713
  couponsEnabled: z.boolean().optional(),
8659
- pointsEnabled: z.boolean().optional().describe("외화 권역은 true로 둘 수 없다")
8714
+ pointsEnabled: z.boolean().optional().describe("외화 권역은 true로 둘 수 없다"),
8715
+ locales: z.array(localeCodeSchema).max(20).optional().describe("이 권역 언어(이슈 #134). 주면 목록 전체를 바꾼다. 첫 언어가 대표 언어다. 비우면 상점 기본 언어 하나다")
8660
8716
  });
8661
8717
  //#endregion
8662
8718
  //#region src/schemas/payment.ts
@@ -9253,6 +9309,7 @@ const orderSchema = z.object({
9253
9309
  }),
9254
9310
  currency: z.string().optional().describe("주문 통화(ISO 4217, 이슈 #130). 금액 필드는 모두 이 통화의 최소 단위다. 외화 주문이 생기면 이 값을 확인한다. 없으면 KRW다. 서버는 항상 싣는다"),
9255
9311
  testPayment: z.boolean().describe("테스트 결제(샌드박스 결제) 주문인가. true면 실제로 돈이 오가지 않았습니다. 상품을 발송하지 않도록 주의하십시오"),
9312
+ locale: z.string().nullable().optional().describe("구매 언어(이슈 #134, BCP 47). 주문상품의 상품명·옵션 이름은 구매자가 이 언어로 본 값이다. null이면 상점 기본 언어다(언어 기능 이전 주문 포함)"),
9256
9313
  items: z.array(orderItemSchema)
9257
9314
  });
9258
9315
  /** 주문 목록 응답 — `GET /v1/orders` */
@@ -9263,12 +9320,12 @@ const testPaymentQuery = z.enum(["true", "false"]).optional().describe("테스
9263
9320
  const pageQuery = { page: z.string().optional().describe("페이지 번호 (1부터, 기본 1)") };
9264
9321
  /**
9265
9322
  * `GET /v1/orders` 쿼리 — OpenAPI 문서용 형태(값은 쿼리 문자열). 검증 규칙은 서버가 적용한다:
9266
- * `orderNo` 없이 `orderedFrom` 누락 400 `MISSING_PARAMETER`, 날짜·`orderNo` 형식 오류 400 `INVALID_PARAMETER`, 31일 초과 400 `RANGE_TOO_WIDE`,
9323
+ * `orderNo` 없이 `orderedFrom` 누락 400 `MISSING_PARAMETER`, 날짜·`orderNo` 형식 오류 400 `INVALID_PARAMETER`, 366일 초과 400 `RANGE_TOO_WIDE`,
9267
9324
  * `testPayment`가 `true`·`false`가 아니면 400 `INVALID_PARAMETER`
9268
9325
  */
9269
9326
  const orderListQuerySchema = z.object({
9270
9327
  orderedFrom: z.string().optional().describe("조회 시작 시각 (ISO 8601 날짜 또는 일시, 포함). `orderNo`가 없으면 필수"),
9271
- orderedTo: z.string().optional().describe("조회 끝 시각 (ISO 8601, 포함). 생략하면 orderedFrom부터 31일. 기간은 최대 31일"),
9328
+ orderedTo: z.string().optional().describe("조회 끝 시각 (ISO 8601, 포함). 생략하면 orderedFrom부터 31일. 기간은 최대 366일"),
9272
9329
  status: orderItemStatusSchema.optional().describe("주문상품 상태 필터 — 이 상태의 주문상품이 하나라도 있는 주문"),
9273
9330
  keyword: z.string().optional().describe("주문 id·주문번호(일치, 하이픈 허용)·주문자명·수령인명(포함) 검색"),
9274
9331
  orderNo: z.string().optional().describe("주문번호 조회(이슈 #107) — 숫자 14자리, 하이픈 허용(`2610-0284-7315-92`). 주면 기간 조건 없이 그 주문만 찾습니다. 형식이 아니면 400 `INVALID_PARAMETER`"),
@@ -9433,6 +9490,69 @@ const purchaseDecisionExtendResultSchema = z.object({
9433
9490
  */
9434
9491
  const addressChangeRequestListSchema = z.array(z.record(z.string(), z.unknown())).describe("배송지 변경 요청 목록 (현재 항상 빈 배열)");
9435
9492
  //#endregion
9493
+ //#region src/schemas/product-localization.ts
9494
+ /**
9495
+ * 상품 번역 (이슈 #134) — 언어 하나의 상품명·상세설명·이미지·옵션 이름. 상품 필드는 상점 기본 언어 값이고 번역 레코드가 언어별 값이다.
9496
+ * 비운 칸(null)은 스토어프론트가 기본 언어 값으로 대체한다(칸 단위 대체). 이미지는 목록 통째로 대체한다.
9497
+ * 옵션은 id가 원천이다 — 값 id·추가금·재고는 언어와 무관하고 이름만 언어별이다.
9498
+ */
9499
+ const translatedOptionValueSchema = z.object({
9500
+ valueId: z.string(),
9501
+ name: z.string().nullable().describe("값 이름. null이면 기본 언어 이름")
9502
+ });
9503
+ const translatedOptionGroupSchema = z.object({
9504
+ groupId: z.string(),
9505
+ name: z.string().nullable().describe("옵션명. null이면 기본 언어 이름"),
9506
+ values: z.array(translatedOptionValueSchema)
9507
+ });
9508
+ const translatedCustomInputSchema = z.object({
9509
+ inputId: z.string(),
9510
+ label: z.string().nullable().describe("항목명. null이면 기본 언어 항목명"),
9511
+ placeholder: z.string().nullable().describe("입력 안내. null이면 기본 언어 안내")
9512
+ });
9513
+ /**
9514
+ * 조회 응답 — 지금 상품의 옵션명·값·직접 입력 항목을 모두 싣고 번역하지 않은 칸은 null이다.
9515
+ * `optionGroups`는 조합 옵션, `addonGroups`는 추가 선택이다(상품 응답과 같은 구분)
9516
+ */
9517
+ const productLocalizationSchema = z.object({
9518
+ locale: z.string().describe("언어(BCP 47)"),
9519
+ name: z.string().nullable().describe("상품명. null이면 기본 언어 상품명"),
9520
+ description: z.string().nullable().describe("상세설명(HTML). null이면 기본 언어 상세설명"),
9521
+ descriptionJson: z.string().nullable().describe("상세설명 에디터 상태(재편집 복원용)"),
9522
+ images: z.array(z.string()).nullable().describe("이미지 목록. null이면 기본 언어 목록"),
9523
+ optionGroups: z.array(translatedOptionGroupSchema),
9524
+ addonGroups: z.array(translatedOptionGroupSchema),
9525
+ customInputs: z.array(translatedCustomInputSchema),
9526
+ updatedAt: z.string()
9527
+ });
9528
+ const translatedNameSchema = z.string().trim().min(1).max(50).nullable().optional();
9529
+ const translatedOptionGroupRequestSchema = z.strictObject({
9530
+ groupId: z.string(),
9531
+ name: translatedNameSchema,
9532
+ values: z.array(z.strictObject({
9533
+ valueId: z.string(),
9534
+ name: translatedNameSchema
9535
+ })).optional()
9536
+ });
9537
+ /**
9538
+ * `PUT /v1/products/{productId}/localizations/{locale}` 본문 — 레코드 전체를 바꾼다. 빠진 칸은 null(기본 언어 값으로 대체)이다.
9539
+ * 옵션은 번역할 id만 보낸다. 상품에 없는 id는 400 `PRODUCT_LOCALIZATION_TARGET_NOT_FOUND`다.
9540
+ * 번역한 옵션명·값 이름도 기본 언어와 같은 규칙(대소문자·앞뒤 공백 무시 유일)이고 겹치면 400 `INVALID_OPTION_MODEL`이다
9541
+ */
9542
+ const productLocalizationRequestSchema = z.strictObject({
9543
+ name: z.string().trim().min(1).max(100).nullable().optional(),
9544
+ description: z.string().nullable().optional(),
9545
+ descriptionJson: z.string().nullable().optional(),
9546
+ images: z.array(productImageUrlSchema).min(1).max(10).nullable().optional(),
9547
+ optionGroups: z.array(translatedOptionGroupRequestSchema).optional(),
9548
+ addonGroups: z.array(translatedOptionGroupRequestSchema).optional(),
9549
+ customInputs: z.array(z.strictObject({
9550
+ inputId: z.string(),
9551
+ label: z.string().trim().min(1).max(30).nullable().optional(),
9552
+ placeholder: z.string().trim().min(1).max(100).nullable().optional()
9553
+ })).optional()
9554
+ });
9555
+ //#endregion
9436
9556
  //#region src/schemas/saved-option-set.ts
9437
9557
  /**
9438
9558
  * 저장 옵션 (이슈 #59) — 자주 쓰는 옵션 구성을 이름 붙여 두고 상품 등록에서 불러온다.
@@ -9925,6 +10045,12 @@ function createStoreClient(options) {
9925
10045
  update: (productId, body) => storeHttp.request("PUT", path`/products/${productId}`, productSchema, { body: productReplaceRequestSchema.parse(body) }),
9926
10046
  patch: (productId, body) => storeHttp.requestVoid("PATCH", path`/products/${productId}`, { body: productPatchRequestSchema.parse(body) }),
9927
10047
  remove: (productId) => storeHttp.requestVoid("DELETE", path`/products/${productId}`),
10048
+ /** 번역(이슈 #134) — 언어별 상품명·상세설명·이미지·옵션 이름 */
10049
+ localizations: {
10050
+ list: (productId) => storeHttp.request("GET", path`/products/${productId}/localizations`, z.array(productLocalizationSchema)),
10051
+ put: (productId, locale, body) => storeHttp.request("PUT", path`/products/${productId}/localizations/${locale}`, productLocalizationSchema, { body: productLocalizationRequestSchema.parse(body) }),
10052
+ remove: (productId, locale) => storeHttp.requestVoid("DELETE", path`/products/${productId}/localizations/${locale}`)
10053
+ },
9928
10054
  bulkUpdateStatus: (productIds, status, idempotencyKey) => storeHttp.request("POST", "/products/bulk/status", bulkResultSchema, {
9929
10055
  body: {
9930
10056
  productIds,
@@ -10013,7 +10139,13 @@ function createStoreClient(options) {
10013
10139
  headers: idempotency(idempotencyKey)
10014
10140
  }),
10015
10141
  update: (categoryId, body) => storeHttp.request("PATCH", path`/categories/${categoryId}`, categorySchema, { body: categoryPatchRequestSchema.parse(body) }),
10016
- remove: (categoryId, opts) => storeHttp.requestVoid("DELETE", path`/categories/${categoryId}`, { query: opts?.strategy ? { strategy: opts.strategy } : {} })
10142
+ remove: (categoryId, opts) => storeHttp.requestVoid("DELETE", path`/categories/${categoryId}`, { query: opts?.strategy ? { strategy: opts.strategy } : {} }),
10143
+ /** 번역(이슈 #134) — 언어별 이름·SEO */
10144
+ localizations: {
10145
+ list: (categoryId) => storeHttp.request("GET", path`/categories/${categoryId}/localizations`, z.array(categoryLocalizationSchema)),
10146
+ put: (categoryId, locale, body) => storeHttp.request("PUT", path`/categories/${categoryId}/localizations/${locale}`, categoryLocalizationSchema, { body: categoryLocalizationRequestSchema.parse(body) }),
10147
+ remove: (categoryId, locale) => storeHttp.requestVoid("DELETE", path`/categories/${categoryId}/localizations/${locale}`)
10148
+ }
10017
10149
  },
10018
10150
  orders: {
10019
10151
  /**
@@ -11112,4 +11244,4 @@ function createStoreSession(options) {
11112
11244
  };
11113
11245
  }
11114
11246
  //#endregion
11115
- export { AI_AGENT_NOTES_DIR, AI_AGENT_PHASES, AI_DESIGN_BOARDS_MAX, AI_DESIGN_BOARD_FILE_PATTERN, AI_DESIGN_BOARD_KINDS, AI_DESIGN_CANVAS_PATH, AI_DESIGN_CONFIRM_APPROVE, AI_DESIGN_DIR, AI_DESIGN_VIEWPORTS, AI_MESSAGE_MAX_ATTACHMENTS, AI_MESSAGE_MAX_CHARS, AI_RUN_ACTIVE_STATUSES, AI_RUN_FILE_CHANGES_RETENTION_DAYS, AI_SETUP_CONFIRM_APPROVE, AI_TODOS_MAX, AI_TODO_STATUSES, APPROVAL_ALREADY_DECIDED_CODE, APPROVAL_REQUIRED_CODE, APP_CAPABILITIES, APP_DEPLOY_KEY_PATTERN, APP_DEPLOY_KEY_PREFIX, APP_EVENTS_MAX, APP_EVENT_SCOPES, APP_EVENT_TYPES, APP_FLOW_EVENT_PATTERN, APP_FLOW_ITEMS_MAX, APP_FLOW_NOTIFICATION_PATTERN, APP_HANDLE_PATTERN, APP_HTTP_KEY_PATTERN, APP_ICON_CONTENT_TYPES, APP_ICON_MAX_BYTES, APP_ICON_MIN_PX, APP_LIFECYCLE_EVENT_TYPES, APP_NETWORK_DENIED_SUFFIXES, APP_NETWORK_HOSTS_MAX, APP_PUBLIC_HTTP_MAX, APP_README_MAX_BYTES, APP_RESERVED_HANDLES, APP_SCHEDULES_MAX, APP_SCHEDULE_INTERVALS, APP_SCHEDULE_NAME_PATTERN, APP_SECRETS_MAX, APP_SECRET_NAME_PATTERN, APP_SECRET_PATTERNS, APP_SERVER_BUNDLE_MAX_GZIP_BYTES, APP_SETTINGS_MAX_FIELDS, APP_SETTING_FIELD_TYPES, APP_SETTING_KEY_PATTERN, APP_STORAGE_KEY_PATTERN, APP_STORAGE_MAX_BYTES, APP_STORAGE_MAX_KEYS, APP_TOOL_NAME_PATTERN, APP_UI_MAX_BYTES, APP_UI_MAX_FILES, ApiError, ApprovalPendingError, BASE_CURRENCY, BRAND_BRIEF_MAX_REFERENCES, BUSINESS_INFO_MAX_LENGTH, BUSINESS_NUMBER_PATTERN, CASH_RECEIPT_STATUS_VALUES, CERTIFICATION_STATUSES, 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, CURRENCIES, CURRENCY_CODES, CUSTOM_INPUT_FORBIDDEN_WORDS, CUSTOM_INPUT_TYPES, DEDICATED_EASY_PAY_PROVIDER, FULFILLMENT_METHODS, FULFILLMENT_METHODS_BY_TYPE, FULFILLMENT_METHOD_RULES, FULFILLMENT_RULES, INSTALLABLE_SCOPES, InvalidPriceUnitError, KAKAOPAY_TEST_CID, KNOWN_WEBHOOK_EVENT_TYPES, KRW_MONEY_RULES, MAX_ADDON_GROUPS, MAX_ANALYTICS_ALLOWED_ORIGINS, MAX_AUTO_TRANSITION_DAYS, MAX_CALENDAR_DAYS, MAX_CERTIFICATION_ITEMS, 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_INFO_SECTION_TITLE, MAX_INVENTORY_OPERATION_LINES, MAX_NOTICE_VALUE_LENGTH, MAX_OPTION_GROUPS, MAX_PICKUP_LOCATIONS, MAX_PRODUCT_IMAGES, MAX_PRODUCT_INFO_SECTIONS, 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, NON_INSTALLABLE_SCOPES, NO_COUPON_SETTLEMENT, NO_SHIPPING_BUNDLE_KEY, PAYMENT_ROUTING_EXCLUSION_CODES, PAYPAL_CURRENCIES, PLATFORM_CODE_SETS, 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, SCOPE_DESCRIPTIONS, SHIPPING_POLICY_DEFAULTS, STARTER_SELLER_TASKS, STARTER_STAGES, STOREFRONT_BLOCKED_PATH_SEGMENTS, STOREFRONT_BUILD_STAGES, STOREFRONT_BUILD_TERMINAL_STATUSES, STOREFRONT_CHECK_TERMINAL_STATUSES, STOREFRONT_CLOSED_SITE_HOLD_DAYS, 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_DRAFT_ATTACHMENT_MAX_BYTES, STORE_DRAFT_MAX_ATTACHMENTS, STORE_DRAFT_RETENTION_DAYS, STORE_ROLE_SCOPES, STORE_SCOPE_RESOURCES, STORE_SESSION_KEYS, STORE_SHOP_TYPES, TEMPLATE_STORE_LOCKED_BUSINESS_FIELDS, 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, additionalCurrencyPriceSchema, additionalCurrencyPricesSchema, addonGroupRequestSchema, addonGroupSchema, addonValueRequestSchema, addonValueSchema, addressChangeRequestListSchema, addressTypeSchema, agentPolicyDecisionSchema, aiActivitySchema, aiAgentPhaseSchema, aiAttachmentSchema, aiChoiceOptionSchema, aiConversationFileChangesSchema, aiConversationSchema, aiConversationSummarySchema, aiDesignBoardSchema, aiDesignCanvasSchema, aiDesignConfirmBoardSchema, aiDesignSelectionSchema, aiFileChangeKindSchema, aiFocusAreaSchema, aiFocusSchema, aiMessagePartSchema, aiMessageSchema, aiPreviewSelectionSchema, aiRunChangesSchema, aiRunChangesStatusSchema, aiRunFileDiffSchema, aiRunRevertConflictDetailsSchema, aiRunRevertResultSchema, aiRunSchema, aiRunStatusSchema, aiSetupConfirmItemSchema, aiStreamAccessSchema, aiStreamEventSchema, aiStreamRecordSchema, aiTodoSchema, aiToolChangeSchema, 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, appArtifactUploadSchema, appBuildSchema, appBuildStageSchema, appCapabilitiesOf, appDeployKeyCreateSchema, appDeployKeyCreatedSchema, appDeployKeySchema, appDevTokenSchema, appDistributionSchema, appEventTypeSchema, appFlowEventSchema, appFlowEventSummarySchema, appFlowNotificationSchema, appFlowNotificationSummarySchema, appFlowParamSchema, appFlowSummaryOf, appHandleSchema, appHttpKeyMatches, appIconProblem, appInstallRequestSchema, appInstallationActivitySchema, appInstallationAppSchema, appInstallationRunSchema, appInstallationSchema, appInstallationSelfSchema, appInstallationSettingsSchema, appInstallationSettingsUpdateSchema, appInstallationStatusSchema, appInvocationSchema, appListingReviewSchema, appListingReviewStatusSchema, appListingSchema, appManifestProblems, appManifestSchema, appManifestWidens, appNetworkHostProblem, appNetworkHostSchema, appReleaseResultSchema, appRuntimeSchema, appScheduleIntervalLabel, appScheduleListOf, appScheduleSummarySchema, appScopeSchema, appSecretSummarySchema, appSessionSchema, appSettingFieldSchema, appStatusSchema, appStorageEntrySchema, appStorageKeysSchema, appStorageListQuerySchema, appStoragePutSchema, appToolCallSchema, appToolInputSchema, appToolListOf, appToolResultSchema, appToolSchema, appToolSummarySchema, appVersionSchema, appVersionStatusSchema, appVisibilitySchema, approvalDecisionRequestSchema, approvalListQuerySchema, approvalPageSchema, approvalRequestSchema, approvalStatusSchema, approveClaimResultSchema, assertSaleUnit, auditActorSchema, auditActorTypeSchema, auditLogListQuerySchema, auditLogOutcomeSchema, auditLogPageSchema, auditLogSchema, auditLogSourceSchema, bestSellingRuleOf, brandBriefProductSourceSchema, brandBriefReferenceSchema, brandBriefSchema, brandBriefViewSchema, 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, claimCollectCompleteRequestSchema, claimDetailSchema, claimHoldResultSchema, claimListQuerySchema, claimReasonSchema, claimRedeliveryRequestSchema, 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, createAiConversationRequestSchema, createAiConversationResponseSchema, createCommerceFlowRequestSchema, createCouponRequestSchema, createMarketRequestSchema, createPkcePair, createStoreClient, createStoreDraftRequestSchema, createStoreDraftResponseSchema, createStoreSession, createStorefrontEditPreviewLinkRequestSchema, createStorefrontPreviewLinkRequestSchema, createStorefrontSiteRequestSchema, createStorefrontVersionRequestSchema, currencyCodeSchema, currencyRefundFeesSchema, currencyShippingPolicySchema, currencySpecOf, 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, describeScope, devStoreSchema, developerAppCreateSchema, developerAppSchema, developerInstallationSchema, developerOrgSchema, developerStoreSchema, disableStorefrontHostingRequestSchema, discountRequestSchema, discountSchema, dispatchRequestSchema, easyPayProviderResponseSchema, easyPayProviderSchema, eventTypeSchema, exchangeAuthorizationCode, floorToSaleUnit, flowActionRequestSchema, flowActionResultSchema, flowActionSchema, flowFieldValueSchema, flowInputFieldSchema, flowNodeTypesSchema, flowNotificationWebhookEventDataSchema, flowNotificationWebhookEventSchema, flowPresetDetailSchema, flowPresetSummarySchema, flowRunSchema, flowRunStepSchema, flowSecretNameSchema, flowSecretSchema, flowStateChangedWebhookEventDataSchema, flowStateChangedWebhookEventSchema, flowStateSchema, formatOrderNo, fromDecimalString, fulfillBulkRequestSchema, fulfillRequestSchema, fulfillmentMethodOf, fulfillmentMethodSchema, fulfillmentMethodsOf, fulfillmentRuleOf, fulfillmentTypeOf, fulfillmentTypeResponseSchema, fulfillmentTypeSchema, holdOrderItemRequestSchema, infoFieldSourceSchema, infoSchemaFieldSchema, infoSchemaSchema, infoSectionRequestSchema, infoSectionSchema, inquiryListQuerySchema, inquirySchema, inquiryWebhookEventDataSchema, inquiryWebhookEventSchema, inventoryAdjustmentLineSchema, inventoryAdjustmentReasonSchema, inventoryAdjustmentRequestSchema, inventoryChangedWebhookEventDataSchema, inventoryChangedWebhookEventSchema, inventoryLevelListQuerySchema, inventoryLevelPageSchema, inventoryLevelSchema, inventoryLocationRequestSchema, inventoryLocationSchema, inventoryModeSchema, inventoryMovementKindSchema, inventoryMovementListQuerySchema, inventoryMovementPageSchema, inventoryMovementSchema, inventoryOperationResultSchema, inventoryTransferRequestSchema, invitationDeliveryStatusSchema, invitationListQuerySchema, invitationSchema, inviteMemberRequestSchema, isAiAgentNotesPath, isAiDesignPath, isCouponTargetLine, isCurrencyCode, isEditableStorefrontPath, isInstallableScope, isReservedStoreCode, isReservedStorefrontSlug, isSaleUnitPrice, isShowcaseStorefrontSlug, isStoreScope, isWebOrigin, issueCouponRequestSchema, issueCouponResultSchema, kakaoPayCredentialsInputSchema, liveGateConditionCodeSchema, liveGateConditionSchema, liveGateErrorDetailsSchema, liveGateSchema, loginProviderSchema, loginProviderStatusSchema, loginProviderTestSchema, loginSettingsSchema, marketSchema, maskedSecretSchema, matchesCollectionRules, mcpRuleResultSchema, mcpToolEventSchema, migrateFlowVersionRequestSchema, migrateFlowVersionResultSchema, minPaymentOf, minorToMajor, moneyRulesOf, moveFlowStateRequestSchema, moveStorefrontFileRequestSchema, myAccountSchema, myStoreSchema, naverPayCredentialsInputSchema, nightsOf, normalizeBusinessNumber, normalizeCouponCode, normalizeStorefrontHostname, normalizeStorefrontPath, oauthTokenResponseSchema, openFulfillmentUnion, optionGroupKindSchema, optionGroupRequestSchema, optionGroupSchema, optionModelRequestSchema, optionModelSchema, optionSelectionSchema, optionSortSchema, optionValueRequestSchema, optionValueSchema, orderCanceledWebhookEventDataSchema, orderCanceledWebhookEventSchema, orderDiscountSchema, orderFlowActionResultSchema, orderFulfilledWebhookEventDataSchema, orderFulfilledWebhookEventSchema, orderItemFlowSchema, orderItemFulfillmentSchema, orderItemFulfillmentSnapshotResponseSchema, orderItemFulfillmentSnapshotSchema, orderItemListQuerySchema, orderItemMemoResultSchema, orderItemPageSchema, orderItemSchema, orderItemStatusSchema, orderListQuerySchema, orderSchema, orderSummaryPageSchema, orderSummarySchema, orderWebhookEventDataSchema, orderWebhookEventSchema, pageInfoSchema, pageQueryShape, pageSchema, parseOrderNo, parseWebhookEvent, payPalCredentialsInputSchema, paymentAttemptRecordSchema, paymentAttemptStatusSchema, paymentCredentialSetSchema, paymentFailureWarningSchema, paymentListQuerySchema, paymentProviderSchema, paymentProviderVerificationSchema, paymentRecordDetailSchema, paymentRecordPageSchema, paymentRecordSchema, paymentRecordStatusSchema, paymentRefundRecordSchema, paymentSettingsSchema, paymentStatusProviderSchema, paymentStatusSchema, pgEnvironmentSchema, pgPaymentMethodSchema, pgProviderResponseSchema, pgProviderSchema, pgVerificationResultSchema, pickupLocationRequestSchema, pickupLocationSchema, pickupLocationSnapshotSchema, planCodeSchema, planEntitlementsSchema, planErrorDetailsSchema, platformCodeSchema, pointAdjustmentRequestSchema, pointAdjustmentResultSchema, pointEarnOf, pointEarnRateBpSchema, pointEarningEnabled, pointEntrySchema, pointExpiresAtOf, pointHistoryQuerySchema, pointLotSchema, pointPolicyNoticeSchema, pointPolicySchema, pointRestoreExpiresAtOf, pointUseOf, pointUsePolicySchema, policyDocumentUrlSchema, policyVersionSchema, portOneChannelSchema, portOneCredentialsInputSchema, productCertificationsRequestSchema, productCertificationsSchema, productCreateRequestSchema, productCurrencyPriceSchema, productCurrencyPricesSchema, productFulfillmentCreateSchema, productFulfillmentResponseSchema, productFulfillmentSchema, productFulfillmentUpdateSchema, productImageRejection, productImageUrlSchema, productListQuerySchema, productNoticeRequestSchema, productNoticeSchema, productOutOfStockWebhookEventDataSchema, productOutOfStockWebhookEventSchema, productPatchRequestSchema, productRefundPolicyOverride, productRefundPolicyPatchSchema, productReplaceRequestSchema, productSchema, productSortSchema, productStatusSchema, productSummarySchema, productVariantRequestSchema, productVariantSchema, proratedPaidRefundBase, proratedPointRefund, proratedRefundBase, publicPlanSchema, publicPlansSchema, publishStorefrontVersionRequestSchema, purchaseDecisionExtendResultSchema, purchaseDecisionRequestResultSchema, purchaseEarnPolicySchema, purchaseEarnRateOf, putBrandBriefRequestSchema, quoteDelivery, quotePricing, rankBestSelling, refreshUserToken, refundPolicyPatchSchema, refundPolicySchema, rejectClaimRequestSchema, remoteAreaLabelOf, remoteAreaOf, remoteAreaSchema, remoteSurchargeOf, replaceStorefrontSourceRequestSchema, replayFlowRequestSchema, replayFlowResultSchema, requiresCollection, requiresShipping, resolvePointPolicy, resolveRefundPolicy, resolveShippingPolicy, resolvedFlowSchema, responsePlanCodeSchema, responsePointEntryTypeSchema, reviewListQuerySchema, reviewReportResultSchema, reviewRewardPointOf, reviewRewardPolicySchema, reviewSchema, reviewSortSchema, reviewWebhookEventDataSchema, reviewWebhookEventSchema, rollbackStorefrontRequestSchema, runStorefrontCheckRequestSchema, salesReportCurrencySchema, salesReportGroupBySchema, salesReportQuerySchema, salesReportRowSchema, salesReportSchema, salesTotalsSchema, saveFlowDraftRequestSchema, saveFlowSecretRequestSchema, saveLoginProviderRequestSchema, savedCustomInputRequestSchema, savedCustomInputSchema, savedOptionGroupRequestSchema, savedOptionGroupSchema, savedOptionSetCompositionSchema, savedOptionSetFromProductRequestSchema, savedOptionSetFromProductResultSchema, savedOptionSetListQuerySchema, savedOptionSetRequestSchema, savedOptionSetSchema, savedOptionSetSortSchema, savedOptionValueRequestSchema, savedOptionValueSchema, scopeAccessSchema, scopesCoverEvent, searchStorefrontFilesRequestSchema, sellerAddressListQuerySchema, sellerAddressRequestSchema, sellerAddressSchema, sellerCancelPreviewSchema, sellerCustomerInquirySchema, sendAiMessageRequestSchema, sendAiMessageResponseSchema, setCalendarRequestSchema, setPlatformTestKeysRequestSchema, setStorefrontVisibilityRequestSchema, settleCouponShortfall, settlementDetailQuerySchema, settlementDetailSchema, settlementListQuerySchema, settlementStatusSchema, settlementSummarySchema, settlementWithDetailsSchema, shippingAddressSchema, shippingCurrencyPriceSchema, shippingCurrencyPricesSchema, shippingPolicyPatchSchema, shippingPolicySchema, simulateFlowRequestSchema, simulateFlowResultSchema, simulationStepSchema, splitRefund, starterSellerTaskSchema, starterStageSchema, starterStatusSchema, starterStoreInfoFieldSchema, stayRangeSchema, staySnapshotSchema, storeAppDetailSchema, storeAppSchema, storeCodeSchema, storeDraftPreviewSchema, storeDraftSchema, storeIndustrySchema, storeMemberRoleUpdatedSchema, storeMemberSchema, storePointPolicySchema, storeRoleSchema, storeSchema, storeScopeResourceSchema, storeSetupBriefSchema, storeShopTypeSchema, storeSubscriptionSchema, storeTemplateSchema, storedAdditionalCurrencyPriceSchema, storedProductCurrencyPriceSchema, storedShippingCurrencyPriceSchema, storefrontBuildDependenciesSchema, storefrontBuildListQuerySchema, storefrontBuildSchema, storefrontBuildStatusSchema, storefrontCheckSchema, storefrontCheckStatusSchema, storefrontCustomDomainStatusSchema, storefrontCustomHostnameProblem, storefrontDependencyFindingSchema, storefrontDeploymentLogSchema, storefrontDeploymentSchema, storefrontDeploymentStepSchema, storefrontDevLogsSchema, 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, storefrontSiteSnapshotSchema, storefrontSiteStatusSchema, storefrontSlugAvailabilityQuerySchema, storefrontSlugAvailabilitySchema, storefrontSlugSchema, storefrontSourceArchivePartSchema, storefrontSourceArchiveQuerySchema, storefrontSourceBlobsResultSchema, storefrontSourceModeSchema, storefrontSourceRefSchema, storefrontSourceReplacedSchema, storefrontSourceSchema, storefrontSuspensionSchema, storefrontTemplateSchema, storefrontVerifyReportSchema, storefrontVersionCreatedSchema, storefrontVersionPreviewLabelOf, storefrontVersionSchema, storefrontVersionStatusSchema, storefrontVisibilitySchema, subscriptionLimitsSchema, subscriptionStatusSchema, subscriptionUsageSchema, toDecimalString, toMinor, tossPaymentsCredentialsInputSchema, trackingStageResponseSchema, trackingUpdateResultSchema, unknownWebhookEventSchema, updateCouponRequestSchema, updateLoginProviderRequestSchema, updateLoginSettingsRequestSchema, updateMarketRequestSchema, updateMemberRoleRequestSchema, updatePaymentProviderRequestSchema, updatePaymentSettingsRequestSchema, updatePointPolicyRequestSchema, updateStoreRequestSchema, updateStoreTemplateRequestSchema, uploadExtensionOf, uploadPurposeSchema, uploadRejection, uploadRequestSchema, uploadStorefrontSourceBlobsRequestSchema, uploadTicketSchema, upsertKakaoPayProviderRequestSchema, upsertNaverPayProviderRequestSchema, upsertPayPalProviderRequestSchema, 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 };
11247
+ export { AI_AGENT_NOTES_DIR, AI_AGENT_PHASES, AI_DESIGN_BOARDS_MAX, AI_DESIGN_BOARD_FILE_PATTERN, AI_DESIGN_BOARD_KINDS, AI_DESIGN_CANVAS_PATH, AI_DESIGN_CONFIRM_APPROVE, AI_DESIGN_DIR, AI_DESIGN_VIEWPORTS, AI_MESSAGE_MAX_ATTACHMENTS, AI_MESSAGE_MAX_CHARS, AI_RUN_ACTIVE_STATUSES, AI_RUN_FILE_CHANGES_RETENTION_DAYS, AI_SETUP_CONFIRM_APPROVE, AI_TODOS_MAX, AI_TODO_STATUSES, APPROVAL_ALREADY_DECIDED_CODE, APPROVAL_REQUIRED_CODE, APP_CAPABILITIES, APP_DEPLOY_KEY_PATTERN, APP_DEPLOY_KEY_PREFIX, APP_EVENTS_MAX, APP_EVENT_SCOPES, APP_EVENT_TYPES, APP_FLOW_EVENT_PATTERN, APP_FLOW_ITEMS_MAX, APP_FLOW_NOTIFICATION_PATTERN, APP_HANDLE_PATTERN, APP_HTTP_KEY_PATTERN, APP_ICON_CONTENT_TYPES, APP_ICON_MAX_BYTES, APP_ICON_MIN_PX, APP_LIFECYCLE_EVENT_TYPES, APP_NETWORK_DENIED_SUFFIXES, APP_NETWORK_HOSTS_MAX, APP_PUBLIC_HTTP_MAX, APP_README_MAX_BYTES, APP_RESERVED_HANDLES, APP_SCHEDULES_MAX, APP_SCHEDULE_INTERVALS, APP_SCHEDULE_NAME_PATTERN, APP_SECRETS_MAX, APP_SECRET_NAME_PATTERN, APP_SECRET_PATTERNS, APP_SERVER_BUNDLE_MAX_GZIP_BYTES, APP_SETTINGS_MAX_FIELDS, APP_SETTING_FIELD_TYPES, APP_SETTING_KEY_PATTERN, APP_STORAGE_KEY_PATTERN, APP_STORAGE_MAX_BYTES, APP_STORAGE_MAX_KEYS, APP_TOOL_NAME_PATTERN, APP_UI_MAX_BYTES, APP_UI_MAX_FILES, ApiError, ApprovalPendingError, BASE_CURRENCY, BRAND_BRIEF_MAX_REFERENCES, BUSINESS_INFO_MAX_LENGTH, BUSINESS_NUMBER_PATTERN, CASH_RECEIPT_STATUS_VALUES, CERTIFICATION_STATUSES, 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, CURRENCIES, CURRENCY_CODES, CUSTOM_INPUT_FORBIDDEN_WORDS, CUSTOM_INPUT_TYPES, DEDICATED_EASY_PAY_PROVIDER, DEFAULT_STORE_LOCALE, FULFILLMENT_METHODS, FULFILLMENT_METHODS_BY_TYPE, FULFILLMENT_METHOD_RULES, FULFILLMENT_RULES, INSTALLABLE_SCOPES, InvalidPriceUnitError, KAKAOPAY_TEST_CID, KNOWN_WEBHOOK_EVENT_TYPES, KRW_MONEY_RULES, MAX_ADDON_GROUPS, MAX_ANALYTICS_ALLOWED_ORIGINS, MAX_AUTO_TRANSITION_DAYS, MAX_CALENDAR_DAYS, MAX_CERTIFICATION_ITEMS, 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_INFO_SECTION_TITLE, MAX_INVENTORY_OPERATION_LINES, MAX_NOTICE_VALUE_LENGTH, MAX_OPTION_GROUPS, MAX_PICKUP_LOCATIONS, MAX_PRODUCT_IMAGES, MAX_PRODUCT_INFO_SECTIONS, 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, NON_INSTALLABLE_SCOPES, NO_COUPON_SETTLEMENT, NO_SHIPPING_BUNDLE_KEY, PAYMENT_ROUTING_EXCLUSION_CODES, PAYPAL_CURRENCIES, PLATFORM_CODE_SETS, 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, SCOPE_DESCRIPTIONS, SHIPPING_POLICY_DEFAULTS, STARTER_SELLER_TASKS, STARTER_STAGES, STOREFRONT_BLOCKED_PATH_SEGMENTS, STOREFRONT_BUILD_STAGES, STOREFRONT_BUILD_TERMINAL_STATUSES, STOREFRONT_CHECK_TERMINAL_STATUSES, STOREFRONT_CLOSED_SITE_HOLD_DAYS, 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_DRAFT_ATTACHMENT_MAX_BYTES, STORE_DRAFT_MAX_ATTACHMENTS, STORE_DRAFT_RETENTION_DAYS, STORE_ROLE_SCOPES, STORE_SCOPE_RESOURCES, STORE_SESSION_KEYS, STORE_SHOP_TYPES, TEMPLATE_STORE_LOCKED_BUSINESS_FIELDS, 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, additionalCurrencyPriceSchema, additionalCurrencyPricesSchema, addonGroupRequestSchema, addonGroupSchema, addonValueRequestSchema, addonValueSchema, addressChangeRequestListSchema, addressTypeSchema, agentPolicyDecisionSchema, aiActivitySchema, aiAgentPhaseSchema, aiAttachmentSchema, aiChoiceOptionSchema, aiConversationFileChangesSchema, aiConversationSchema, aiConversationSummarySchema, aiDesignBoardSchema, aiDesignCanvasSchema, aiDesignConfirmBoardSchema, aiDesignSelectionSchema, aiFileChangeKindSchema, aiFocusAreaSchema, aiFocusSchema, aiMessagePartSchema, aiMessageSchema, aiPreviewSelectionSchema, aiRunChangesSchema, aiRunChangesStatusSchema, aiRunFileDiffSchema, aiRunRevertConflictDetailsSchema, aiRunRevertResultSchema, aiRunSchema, aiRunStatusSchema, aiSetupConfirmItemSchema, aiStreamAccessSchema, aiStreamEventSchema, aiStreamRecordSchema, aiTodoSchema, aiToolChangeSchema, 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, appArtifactUploadSchema, appBuildSchema, appBuildStageSchema, appCapabilitiesOf, appDeployKeyCreateSchema, appDeployKeyCreatedSchema, appDeployKeySchema, appDevTokenSchema, appDistributionSchema, appEventTypeSchema, appFlowEventSchema, appFlowEventSummarySchema, appFlowNotificationSchema, appFlowNotificationSummarySchema, appFlowParamSchema, appFlowSummaryOf, appHandleSchema, appHttpKeyMatches, appIconProblem, appInstallRequestSchema, appInstallationActivitySchema, appInstallationAppSchema, appInstallationRunSchema, appInstallationSchema, appInstallationSelfSchema, appInstallationSettingsSchema, appInstallationSettingsUpdateSchema, appInstallationStatusSchema, appInvocationSchema, appListingReviewSchema, appListingReviewStatusSchema, appListingSchema, appManifestProblems, appManifestSchema, appManifestWidens, appNetworkHostProblem, appNetworkHostSchema, appReleaseResultSchema, appRuntimeSchema, appScheduleIntervalLabel, appScheduleListOf, appScheduleSummarySchema, appScopeSchema, appSecretSummarySchema, appSessionSchema, appSettingFieldSchema, appStatusSchema, appStorageEntrySchema, appStorageKeysSchema, appStorageListQuerySchema, appStoragePutSchema, appToolCallSchema, appToolInputSchema, appToolListOf, appToolResultSchema, appToolSchema, appToolSummarySchema, appVersionSchema, appVersionStatusSchema, appVisibilitySchema, approvalDecisionRequestSchema, approvalListQuerySchema, approvalPageSchema, approvalRequestSchema, approvalStatusSchema, approveClaimResultSchema, assertSaleUnit, auditActorSchema, auditActorTypeSchema, auditLogListQuerySchema, auditLogOutcomeSchema, auditLogPageSchema, auditLogSchema, auditLogSourceSchema, bestSellingRuleOf, brandBriefProductSourceSchema, brandBriefReferenceSchema, brandBriefSchema, brandBriefViewSchema, buildAuthorizeUrl, buildQuery, bulkResultSchema, businessInfoPatchShape, businessInfoResponseShape, businessNumberSchema, calendarDateSchema, calendarDaySchema, calendarQuerySchema, cancelBySellerRequestSchema, cancelBySellerResultSchema, carrierSchema, cashReceiptSchema, categoryAttributeSchema, categoryCreateRequestSchema, categoryDeleteQuerySchema, categoryDeleteStrategySchema, categoryListQuerySchema, categoryLocalizationRequestSchema, categoryLocalizationSchema, categoryPatchRequestSchema, categoryProductSortSchema, categorySchema, categorySearchResultSchema, categoryTreeNodeSchema, categoryWithPathSchema, changeStorefrontSlugRequestSchema, changeStorefrontTemplateRequestSchema, changeTypeSchema, claimCollectCompleteRequestSchema, claimDetailSchema, claimHoldResultSchema, claimListQuerySchema, claimReasonSchema, claimRedeliveryRequestSchema, 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, createAiConversationRequestSchema, createAiConversationResponseSchema, createCommerceFlowRequestSchema, createCouponRequestSchema, createMarketRequestSchema, createPkcePair, createStoreClient, createStoreDraftRequestSchema, createStoreDraftResponseSchema, createStoreSession, createStorefrontEditPreviewLinkRequestSchema, createStorefrontPreviewLinkRequestSchema, createStorefrontSiteRequestSchema, createStorefrontVersionRequestSchema, currencyCodeSchema, currencyRefundFeesSchema, currencyShippingPolicySchema, currencySpecOf, 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, describeScope, devStoreSchema, developerAppCreateSchema, developerAppSchema, developerInstallationSchema, developerOrgSchema, developerStoreSchema, disableStorefrontHostingRequestSchema, discountRequestSchema, discountSchema, dispatchRequestSchema, easyPayProviderResponseSchema, easyPayProviderSchema, eventTypeSchema, exchangeAuthorizationCode, floorToSaleUnit, flowActionRequestSchema, flowActionResultSchema, flowActionSchema, flowFieldValueSchema, flowInputFieldSchema, flowNodeTypesSchema, flowNotificationWebhookEventDataSchema, flowNotificationWebhookEventSchema, flowPresetDetailSchema, flowPresetSummarySchema, flowRunSchema, flowRunStepSchema, flowSecretNameSchema, flowSecretSchema, flowStateChangedWebhookEventDataSchema, flowStateChangedWebhookEventSchema, flowStateSchema, formatOrderNo, fromDecimalString, fulfillBulkRequestSchema, fulfillRequestSchema, fulfillmentMethodOf, fulfillmentMethodSchema, fulfillmentMethodsOf, fulfillmentRuleOf, fulfillmentTypeOf, fulfillmentTypeResponseSchema, fulfillmentTypeSchema, holdOrderItemRequestSchema, infoFieldSourceSchema, infoSchemaFieldSchema, infoSchemaSchema, infoSectionRequestSchema, infoSectionSchema, inquiryListQuerySchema, inquirySchema, inquiryWebhookEventDataSchema, inquiryWebhookEventSchema, inventoryAdjustmentLineSchema, inventoryAdjustmentReasonSchema, inventoryAdjustmentRequestSchema, inventoryChangedWebhookEventDataSchema, inventoryChangedWebhookEventSchema, inventoryLevelListQuerySchema, inventoryLevelPageSchema, inventoryLevelSchema, inventoryLocationRequestSchema, inventoryLocationSchema, inventoryModeSchema, inventoryMovementKindSchema, inventoryMovementListQuerySchema, inventoryMovementPageSchema, inventoryMovementSchema, inventoryOperationResultSchema, inventoryTransferRequestSchema, invitationDeliveryStatusSchema, invitationListQuerySchema, invitationSchema, inviteMemberRequestSchema, isAiAgentNotesPath, isAiDesignPath, isCouponTargetLine, isCurrencyCode, isEditableStorefrontPath, isInstallableScope, isReservedStoreCode, isReservedStorefrontSlug, isSaleUnitPrice, isShowcaseStorefrontSlug, isStoreScope, isWebOrigin, issueCouponRequestSchema, issueCouponResultSchema, kakaoPayCredentialsInputSchema, liveGateConditionCodeSchema, liveGateConditionSchema, liveGateErrorDetailsSchema, liveGateSchema, localeCodeSchema, loginProviderSchema, loginProviderStatusSchema, loginProviderTestSchema, loginSettingsSchema, marketSchema, maskedSecretSchema, matchesCollectionRules, mcpRuleResultSchema, mcpToolEventSchema, migrateFlowVersionRequestSchema, migrateFlowVersionResultSchema, minPaymentOf, minorToMajor, moneyRulesOf, moveFlowStateRequestSchema, moveStorefrontFileRequestSchema, myAccountSchema, myStoreSchema, naverPayCredentialsInputSchema, nightsOf, normalizeBusinessNumber, normalizeCouponCode, normalizeLocale, normalizeStorefrontHostname, normalizeStorefrontPath, oauthTokenResponseSchema, openFulfillmentUnion, optionGroupKindSchema, optionGroupRequestSchema, optionGroupSchema, optionModelRequestSchema, optionModelSchema, optionSelectionSchema, optionSortSchema, optionValueRequestSchema, optionValueSchema, orderCanceledWebhookEventDataSchema, orderCanceledWebhookEventSchema, orderDiscountSchema, orderFlowActionResultSchema, orderFulfilledWebhookEventDataSchema, orderFulfilledWebhookEventSchema, orderItemFlowSchema, orderItemFulfillmentSchema, orderItemFulfillmentSnapshotResponseSchema, orderItemFulfillmentSnapshotSchema, orderItemListQuerySchema, orderItemMemoResultSchema, orderItemPageSchema, orderItemSchema, orderItemStatusSchema, orderListQuerySchema, orderSchema, orderSummaryPageSchema, orderSummarySchema, orderWebhookEventDataSchema, orderWebhookEventSchema, pageInfoSchema, pageQueryShape, pageSchema, parseOrderNo, parseWebhookEvent, payPalCredentialsInputSchema, paymentAttemptRecordSchema, paymentAttemptStatusSchema, paymentCredentialSetSchema, paymentFailureWarningSchema, paymentListQuerySchema, paymentProviderSchema, paymentProviderVerificationSchema, paymentRecordDetailSchema, paymentRecordPageSchema, paymentRecordSchema, paymentRecordStatusSchema, paymentRefundRecordSchema, paymentSettingsSchema, paymentStatusProviderSchema, paymentStatusSchema, pgEnvironmentSchema, pgPaymentMethodSchema, pgProviderResponseSchema, pgProviderSchema, pgVerificationResultSchema, pickupLocationRequestSchema, pickupLocationSchema, pickupLocationSnapshotSchema, planCodeSchema, planEntitlementsSchema, planErrorDetailsSchema, platformCodeSchema, pointAdjustmentRequestSchema, pointAdjustmentResultSchema, pointEarnOf, pointEarnRateBpSchema, pointEarningEnabled, pointEntrySchema, pointExpiresAtOf, pointHistoryQuerySchema, pointLotSchema, pointPolicyNoticeSchema, pointPolicySchema, pointRestoreExpiresAtOf, pointUseOf, pointUsePolicySchema, policyDocumentUrlSchema, policyVersionSchema, portOneChannelSchema, portOneCredentialsInputSchema, productCertificationsRequestSchema, productCertificationsSchema, productCreateRequestSchema, productCurrencyPriceSchema, productCurrencyPricesSchema, productFulfillmentCreateSchema, productFulfillmentResponseSchema, productFulfillmentSchema, productFulfillmentUpdateSchema, productImageRejection, productImageUrlSchema, productListQuerySchema, productLocalizationRequestSchema, productLocalizationSchema, productNoticeRequestSchema, productNoticeSchema, productOutOfStockWebhookEventDataSchema, productOutOfStockWebhookEventSchema, productPatchRequestSchema, productRefundPolicyOverride, productRefundPolicyPatchSchema, productReplaceRequestSchema, productSchema, productSortSchema, productStatusSchema, productSummarySchema, productVariantRequestSchema, productVariantSchema, proratedPaidRefundBase, proratedPointRefund, proratedRefundBase, publicPlanSchema, publicPlansSchema, publishStorefrontVersionRequestSchema, purchaseDecisionExtendResultSchema, purchaseDecisionRequestResultSchema, purchaseEarnPolicySchema, purchaseEarnRateOf, putBrandBriefRequestSchema, quoteDelivery, quotePricing, rankBestSelling, refreshUserToken, refundPolicyPatchSchema, refundPolicySchema, rejectClaimRequestSchema, remoteAreaLabelOf, remoteAreaOf, remoteAreaSchema, remoteSurchargeOf, replaceStorefrontSourceRequestSchema, replayFlowRequestSchema, replayFlowResultSchema, requiresCollection, requiresShipping, resolvePointPolicy, resolveRefundPolicy, resolveShippingPolicy, resolvedFlowSchema, responsePlanCodeSchema, responsePointEntryTypeSchema, reviewListQuerySchema, reviewReportResultSchema, reviewRewardPointOf, reviewRewardPolicySchema, reviewSchema, reviewSortSchema, reviewWebhookEventDataSchema, reviewWebhookEventSchema, rollbackStorefrontRequestSchema, runStorefrontCheckRequestSchema, salesReportCurrencySchema, salesReportGroupBySchema, salesReportQuerySchema, salesReportRowSchema, salesReportSchema, salesTotalsSchema, saveFlowDraftRequestSchema, saveFlowSecretRequestSchema, saveLoginProviderRequestSchema, savedCustomInputRequestSchema, savedCustomInputSchema, savedOptionGroupRequestSchema, savedOptionGroupSchema, savedOptionSetCompositionSchema, savedOptionSetFromProductRequestSchema, savedOptionSetFromProductResultSchema, savedOptionSetListQuerySchema, savedOptionSetRequestSchema, savedOptionSetSchema, savedOptionSetSortSchema, savedOptionValueRequestSchema, savedOptionValueSchema, scopeAccessSchema, scopesCoverEvent, searchStorefrontFilesRequestSchema, sellerAddressListQuerySchema, sellerAddressRequestSchema, sellerAddressSchema, sellerCancelPreviewSchema, sellerCustomerInquirySchema, sendAiMessageRequestSchema, sendAiMessageResponseSchema, setCalendarRequestSchema, setPlatformTestKeysRequestSchema, setStorefrontVisibilityRequestSchema, settleCouponShortfall, settlementDetailQuerySchema, settlementDetailSchema, settlementListQuerySchema, settlementStatusSchema, settlementSummarySchema, settlementWithDetailsSchema, shippingAddressSchema, shippingCurrencyPriceSchema, shippingCurrencyPricesSchema, shippingPolicyPatchSchema, shippingPolicySchema, simulateFlowRequestSchema, simulateFlowResultSchema, simulationStepSchema, splitRefund, starterSellerTaskSchema, starterStageSchema, starterStatusSchema, starterStoreInfoFieldSchema, stayRangeSchema, staySnapshotSchema, storeAppDetailSchema, storeAppSchema, storeCodeSchema, storeDraftPreviewSchema, storeDraftSchema, storeIndustrySchema, storeMemberRoleUpdatedSchema, storeMemberSchema, storePointPolicySchema, storeRoleSchema, storeSchema, storeScopeResourceSchema, storeSetupBriefSchema, storeShopTypeSchema, storeSubscriptionSchema, storeTemplateSchema, storedAdditionalCurrencyPriceSchema, storedProductCurrencyPriceSchema, storedShippingCurrencyPriceSchema, storefrontBuildDependenciesSchema, storefrontBuildListQuerySchema, storefrontBuildSchema, storefrontBuildStatusSchema, storefrontCheckSchema, storefrontCheckStatusSchema, storefrontCustomDomainStatusSchema, storefrontCustomHostnameProblem, storefrontDependencyFindingSchema, storefrontDeploymentLogSchema, storefrontDeploymentSchema, storefrontDeploymentStepSchema, storefrontDevLogsSchema, 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, storefrontSiteSnapshotSchema, storefrontSiteStatusSchema, storefrontSlugAvailabilityQuerySchema, storefrontSlugAvailabilitySchema, storefrontSlugSchema, storefrontSourceArchivePartSchema, storefrontSourceArchiveQuerySchema, storefrontSourceBlobsResultSchema, storefrontSourceModeSchema, storefrontSourceRefSchema, storefrontSourceReplacedSchema, storefrontSourceSchema, storefrontSuspensionSchema, storefrontTemplateSchema, storefrontVerifyReportSchema, storefrontVersionCreatedSchema, storefrontVersionPreviewLabelOf, storefrontVersionSchema, storefrontVersionStatusSchema, storefrontVisibilitySchema, subscriptionLimitsSchema, subscriptionStatusSchema, subscriptionUsageSchema, toDecimalString, toMinor, tossPaymentsCredentialsInputSchema, trackingStageResponseSchema, trackingUpdateResultSchema, unknownWebhookEventSchema, updateCouponRequestSchema, updateLoginProviderRequestSchema, updateLoginSettingsRequestSchema, updateMarketRequestSchema, updateMemberRoleRequestSchema, updatePaymentProviderRequestSchema, updatePaymentSettingsRequestSchema, updatePointPolicyRequestSchema, updateStoreRequestSchema, updateStoreTemplateRequestSchema, uploadExtensionOf, uploadPurposeSchema, uploadRejection, uploadRequestSchema, uploadStorefrontSourceBlobsRequestSchema, uploadTicketSchema, upsertKakaoPayProviderRequestSchema, upsertNaverPayProviderRequestSchema, upsertPayPalProviderRequestSchema, 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 };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sayren/store-sdk",
3
- "version": "0.34.0",
3
+ "version": "0.35.0",
4
4
  "main": "./dist/index.mjs",
5
5
  "types": "./dist/index.d.mts",
6
6
  "exports": {
package/src/client.ts CHANGED
@@ -63,9 +63,12 @@ import { myAccountSchema, myStoreSchema } from "./schemas/auth";
63
63
  import {
64
64
  type CategoryCreateRequest,
65
65
  type CategoryDeleteStrategy,
66
+ type CategoryLocalizationRequest,
66
67
  type CategoryPatchRequest,
67
68
  categoryAttributeSchema,
68
69
  categoryCreateRequestSchema,
70
+ categoryLocalizationRequestSchema,
71
+ categoryLocalizationSchema,
69
72
  categoryPatchRequestSchema,
70
73
  categorySchema,
71
74
  categorySearchResultSchema,
@@ -314,6 +317,11 @@ import {
314
317
  infoSectionSchema,
315
318
  platformCodeSchema,
316
319
  } from "./schemas/product-info";
320
+ import {
321
+ type ProductLocalizationRequest,
322
+ productLocalizationRequestSchema,
323
+ productLocalizationSchema,
324
+ } from "./schemas/product-localization";
317
325
  import {
318
326
  type SavedOptionSetFromProductRequestInput,
319
327
  type SavedOptionSetListParams,
@@ -592,6 +600,24 @@ export function createStoreClient(options: StoreClientOptions) {
592
600
  body: productPatchRequestSchema.parse(body),
593
601
  }),
594
602
  remove: (productId: string) => storeHttp.requestVoid("DELETE", path`/products/${productId}`),
603
+ /** 번역(이슈 #134) — 언어별 상품명·상세설명·이미지·옵션 이름 */
604
+ localizations: {
605
+ list: (productId: string) =>
606
+ storeHttp.request(
607
+ "GET",
608
+ path`/products/${productId}/localizations`,
609
+ z.array(productLocalizationSchema),
610
+ ),
611
+ put: (productId: string, locale: string, body: ProductLocalizationRequest) =>
612
+ storeHttp.request(
613
+ "PUT",
614
+ path`/products/${productId}/localizations/${locale}`,
615
+ productLocalizationSchema,
616
+ { body: productLocalizationRequestSchema.parse(body) },
617
+ ),
618
+ remove: (productId: string, locale: string) =>
619
+ storeHttp.requestVoid("DELETE", path`/products/${productId}/localizations/${locale}`),
620
+ },
595
621
  bulkUpdateStatus: (productIds: string[], status: ProductStatus, idempotencyKey?: string) =>
596
622
  storeHttp.request("POST", "/products/bulk/status", bulkResultSchema, {
597
623
  body: { productIds, status: productStatusSchema.parse(status) },
@@ -796,6 +822,24 @@ export function createStoreClient(options: StoreClientOptions) {
796
822
  storeHttp.requestVoid("DELETE", path`/categories/${categoryId}`, {
797
823
  query: (opts?.strategy ? { strategy: opts.strategy } : {}) as Query,
798
824
  }),
825
+ /** 번역(이슈 #134) — 언어별 이름·SEO */
826
+ localizations: {
827
+ list: (categoryId: string) =>
828
+ storeHttp.request(
829
+ "GET",
830
+ path`/categories/${categoryId}/localizations`,
831
+ z.array(categoryLocalizationSchema),
832
+ ),
833
+ put: (categoryId: string, locale: string, body: CategoryLocalizationRequest) =>
834
+ storeHttp.request(
835
+ "PUT",
836
+ path`/categories/${categoryId}/localizations/${locale}`,
837
+ categoryLocalizationSchema,
838
+ { body: categoryLocalizationRequestSchema.parse(body) },
839
+ ),
840
+ remove: (categoryId: string, locale: string) =>
841
+ storeHttp.requestVoid("DELETE", path`/categories/${categoryId}/localizations/${locale}`),
842
+ },
799
843
  },
800
844
 
801
845
  orders: {
package/src/index.ts CHANGED
@@ -36,6 +36,7 @@ export * from "./schemas/customer";
36
36
  export * from "./schemas/customer-delegation";
37
37
  export * from "./schemas/fulfillment";
38
38
  export * from "./schemas/inventory";
39
+ export * from "./schemas/locale";
39
40
  export * from "./schemas/login";
40
41
  export * from "./schemas/market";
41
42
  export * from "./schemas/misc";
@@ -44,6 +45,7 @@ export * from "./schemas/payment";
44
45
  export * from "./schemas/points";
45
46
  export * from "./schemas/product";
46
47
  export * from "./schemas/product-info";
48
+ export * from "./schemas/product-localization";
47
49
  export * from "./schemas/promotion";
48
50
  export * from "./schemas/refund-policy";
49
51
  export * from "./schemas/saved-option-set";
@@ -146,3 +146,28 @@ export const categoryDeleteQuerySchema = z.object({
146
146
  "`reparent`는 직계 자식을 삭제할 카테고리의 부모로 옮기고, `cascade`는 서브트리를 삭제하고 연결 상품을 미분류로 둔다",
147
147
  ),
148
148
  });
149
+
150
+ /**
151
+ * 카테고리 번역 (이슈 #134) — 언어 하나의 이름·SEO. 카테고리 필드(`name`·`meta*`)는 상점 기본 언어 값이고 번역 레코드가 언어별 값이다.
152
+ * 비운 칸(null)은 스토어프론트가 기본 언어 값으로 대체한다(칸 단위 대체).
153
+ */
154
+ export const categoryLocalizationSchema = z.object({
155
+ locale: z.string().describe("언어(BCP 47)"),
156
+ name: z.string().nullable().describe("이름. null이면 기본 언어 이름"),
157
+ metaTitle: z.string().nullable(),
158
+ metaDescription: z.string().nullable(),
159
+ metaKeywords: z.string().nullable(),
160
+ updatedAt: z.string(),
161
+ });
162
+
163
+ export type CategoryLocalization = z.infer<typeof categoryLocalizationSchema>;
164
+
165
+ /** `PUT /v1/categories/{categoryId}/localizations/{locale}` 본문 — 레코드 전체를 바꾼다. 빠진 칸은 null(기본 언어 값으로 대체)이다 */
166
+ export const categoryLocalizationRequestSchema = z.strictObject({
167
+ name: z.string().trim().min(1).max(100).nullable().optional(),
168
+ metaTitle: z.string().max(100).nullable().optional(),
169
+ metaDescription: z.string().max(300).nullable().optional(),
170
+ metaKeywords: z.string().max(200).nullable().optional(),
171
+ });
172
+
173
+ export type CategoryLocalizationRequest = z.infer<typeof categoryLocalizationRequestSchema>;
@@ -0,0 +1,39 @@
1
+ import { z } from "zod";
2
+
3
+ /**
4
+ * 언어 코드 (이슈 #134) — BCP 47의 언어[-문자][-지역]까지 받는다(`ko`·`en`·`en-US`·`zh-Hant-TW`).
5
+ * 대소문자는 표준 표기로 맞춘다(언어 소문자, 문자 첫 글자 대문자, 지역 대문자). 맞지 않으면 null이다.
6
+ */
7
+ const LOCALE_PATTERN = /^([a-z]{2,3})(?:-([a-z]{4}))?(?:-([a-z]{2}))?$/;
8
+
9
+ export function normalizeLocale(value: string | null | undefined): string | null {
10
+ const match = value?.trim().replace(/_/g, "-").toLowerCase().match(LOCALE_PATTERN);
11
+ if (!match) return null;
12
+ const [, language, script, region] = match;
13
+ return [
14
+ language,
15
+ script ? `${script[0]?.toUpperCase()}${script.slice(1)}` : null,
16
+ region ? region.toUpperCase() : null,
17
+ ]
18
+ .filter(Boolean)
19
+ .join("-");
20
+ }
21
+
22
+ /** 상점 기본 언어 — 옛 상점과 언어를 정하지 않은 상점의 값이다 */
23
+ export const DEFAULT_STORE_LOCALE = "ko";
24
+
25
+ export const localeCodeSchema = z
26
+ .string()
27
+ .max(35)
28
+ .transform((value, ctx) => {
29
+ const normalized = normalizeLocale(value);
30
+ if (normalized === null) {
31
+ ctx.addIssue({
32
+ code: "custom",
33
+ message: "언어는 BCP 47 언어 코드입니다(예: ko·en·en-US)",
34
+ });
35
+ return z.NEVER;
36
+ }
37
+ return normalized;
38
+ })
39
+ .describe("언어(BCP 47, 예: ko·en·en-US·zh-Hant-TW)");
@@ -1,5 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { currencyCodeSchema } from "./currency";
3
+ import { localeCodeSchema } from "./locale";
3
4
 
4
5
  /**
5
6
  * 판매 권역 (이슈 #130) — 상점이 어느 국가에 어느 통화로 파는지를 정한다.
@@ -9,6 +10,8 @@ import { currencyCodeSchema } from "./currency";
9
10
  *
10
11
  * 스토어프론트는 요청마다 도메인(`X-Storefront-Host`) → 구매자 국가(`X-Buyer-Country`) → 기본 권역 순으로 권역을 고르고, 주문서가 그 권역·통화를 굳힌다.
11
12
  * 외화 권역은 적립금을 켤 수 없다(적립금은 기본 통화 단위다).
13
+ *
14
+ * 권역은 언어도 정한다(이슈 #134). `locales`는 이 권역 스토어프론트가 내는 언어이고 첫 언어가 대표 언어다. 비어 있으면 상점 기본 언어 하나다.
12
15
  */
13
16
 
14
17
  const countryCodeSchema = z
@@ -44,6 +47,13 @@ export const marketSchema = z.object({
44
47
  .string()
45
48
  .nullable()
46
49
  .describe("보관 시각. 보관한 권역은 판정에서 빠지고 그 국가·도메인은 풀린다"),
50
+ locales: z
51
+ .array(z.string())
52
+ .optional()
53
+ .default([])
54
+ .describe(
55
+ "이 권역 언어(이슈 #134). 첫 언어가 대표 언어다. 비어 있으면 상점 기본 언어 하나다. 서버는 항상 싣는다",
56
+ ),
47
57
  });
48
58
 
49
59
  export type Market = z.infer<typeof marketSchema>;
@@ -55,6 +65,13 @@ export const createMarketRequestSchema = z.strictObject({
55
65
  domains: z.array(hostnameSchema).max(20).optional(),
56
66
  couponsEnabled: z.boolean().optional().describe("기본 false"),
57
67
  pointsEnabled: z.boolean().optional().describe("기본 false. 외화 권역은 true로 둘 수 없다"),
68
+ locales: z
69
+ .array(localeCodeSchema)
70
+ .max(20)
71
+ .optional()
72
+ .describe(
73
+ "이 권역 언어(이슈 #134). 주면 목록 전체를 바꾼다. 첫 언어가 대표 언어다. 비우면 상점 기본 언어 하나다",
74
+ ),
58
75
  });
59
76
 
60
77
  export type CreateMarketRequest = z.infer<typeof createMarketRequestSchema>;
@@ -70,6 +87,13 @@ export const updateMarketRequestSchema = z.strictObject({
70
87
  domains: z.array(hostnameSchema).max(20).optional().describe("주면 도메인 목록 전체를 바꾼다"),
71
88
  couponsEnabled: z.boolean().optional(),
72
89
  pointsEnabled: z.boolean().optional().describe("외화 권역은 true로 둘 수 없다"),
90
+ locales: z
91
+ .array(localeCodeSchema)
92
+ .max(20)
93
+ .optional()
94
+ .describe(
95
+ "이 권역 언어(이슈 #134). 주면 목록 전체를 바꾼다. 첫 언어가 대표 언어다. 비우면 상점 기본 언어 하나다",
96
+ ),
73
97
  });
74
98
 
75
99
  export type UpdateMarketRequest = z.infer<typeof updateMarketRequestSchema>;
@@ -284,6 +284,13 @@ export const orderSchema = z.object({
284
284
  .describe(
285
285
  "테스트 결제(샌드박스 결제) 주문인가. true면 실제로 돈이 오가지 않았습니다. 상품을 발송하지 않도록 주의하십시오",
286
286
  ),
287
+ locale: z
288
+ .string()
289
+ .nullable()
290
+ .optional()
291
+ .describe(
292
+ "구매 언어(이슈 #134, BCP 47). 주문상품의 상품명·옵션 이름은 구매자가 이 언어로 본 값이다. null이면 상점 기본 언어다(언어 기능 이전 주문 포함)",
293
+ ),
287
294
  items: z.array(orderItemSchema),
288
295
  });
289
296
 
@@ -310,7 +317,7 @@ const pageQuery = {
310
317
 
311
318
  /**
312
319
  * `GET /v1/orders` 쿼리 — OpenAPI 문서용 형태(값은 쿼리 문자열). 검증 규칙은 서버가 적용한다:
313
- * `orderNo` 없이 `orderedFrom` 누락 400 `MISSING_PARAMETER`, 날짜·`orderNo` 형식 오류 400 `INVALID_PARAMETER`, 31일 초과 400 `RANGE_TOO_WIDE`,
320
+ * `orderNo` 없이 `orderedFrom` 누락 400 `MISSING_PARAMETER`, 날짜·`orderNo` 형식 오류 400 `INVALID_PARAMETER`, 366일 초과 400 `RANGE_TOO_WIDE`,
314
321
  * `testPayment`가 `true`·`false`가 아니면 400 `INVALID_PARAMETER`
315
322
  */
316
323
  export const orderListQuerySchema = z.object({
@@ -321,7 +328,7 @@ export const orderListQuerySchema = z.object({
321
328
  orderedTo: z
322
329
  .string()
323
330
  .optional()
324
- .describe("조회 끝 시각 (ISO 8601, 포함). 생략하면 orderedFrom부터 31일. 기간은 최대 31일"),
331
+ .describe("조회 끝 시각 (ISO 8601, 포함). 생략하면 orderedFrom부터 31일. 기간은 최대 366일"),
325
332
  status: orderItemStatusSchema
326
333
  .optional()
327
334
  .describe("주문상품 상태 필터 — 이 상태의 주문상품이 하나라도 있는 주문"),
@@ -0,0 +1,76 @@
1
+ import { z } from "zod";
2
+ import { MAX_PRODUCT_IMAGES, productImageUrlSchema } from "./product";
3
+
4
+ /**
5
+ * 상품 번역 (이슈 #134) — 언어 하나의 상품명·상세설명·이미지·옵션 이름. 상품 필드는 상점 기본 언어 값이고 번역 레코드가 언어별 값이다.
6
+ * 비운 칸(null)은 스토어프론트가 기본 언어 값으로 대체한다(칸 단위 대체). 이미지는 목록 통째로 대체한다.
7
+ * 옵션은 id가 원천이다 — 값 id·추가금·재고는 언어와 무관하고 이름만 언어별이다.
8
+ */
9
+
10
+ const translatedOptionValueSchema = z.object({
11
+ valueId: z.string(),
12
+ name: z.string().nullable().describe("값 이름. null이면 기본 언어 이름"),
13
+ });
14
+
15
+ const translatedOptionGroupSchema = z.object({
16
+ groupId: z.string(),
17
+ name: z.string().nullable().describe("옵션명. null이면 기본 언어 이름"),
18
+ values: z.array(translatedOptionValueSchema),
19
+ });
20
+
21
+ const translatedCustomInputSchema = z.object({
22
+ inputId: z.string(),
23
+ label: z.string().nullable().describe("항목명. null이면 기본 언어 항목명"),
24
+ placeholder: z.string().nullable().describe("입력 안내. null이면 기본 언어 안내"),
25
+ });
26
+
27
+ /**
28
+ * 조회 응답 — 지금 상품의 옵션명·값·직접 입력 항목을 모두 싣고 번역하지 않은 칸은 null이다.
29
+ * `optionGroups`는 조합 옵션, `addonGroups`는 추가 선택이다(상품 응답과 같은 구분)
30
+ */
31
+ export const productLocalizationSchema = z.object({
32
+ locale: z.string().describe("언어(BCP 47)"),
33
+ name: z.string().nullable().describe("상품명. null이면 기본 언어 상품명"),
34
+ description: z.string().nullable().describe("상세설명(HTML). null이면 기본 언어 상세설명"),
35
+ descriptionJson: z.string().nullable().describe("상세설명 에디터 상태(재편집 복원용)"),
36
+ images: z.array(z.string()).nullable().describe("이미지 목록. null이면 기본 언어 목록"),
37
+ optionGroups: z.array(translatedOptionGroupSchema),
38
+ addonGroups: z.array(translatedOptionGroupSchema),
39
+ customInputs: z.array(translatedCustomInputSchema),
40
+ updatedAt: z.string(),
41
+ });
42
+
43
+ export type ProductLocalization = z.infer<typeof productLocalizationSchema>;
44
+
45
+ const translatedNameSchema = z.string().trim().min(1).max(50).nullable().optional();
46
+
47
+ const translatedOptionGroupRequestSchema = z.strictObject({
48
+ groupId: z.string(),
49
+ name: translatedNameSchema,
50
+ values: z.array(z.strictObject({ valueId: z.string(), name: translatedNameSchema })).optional(),
51
+ });
52
+
53
+ /**
54
+ * `PUT /v1/products/{productId}/localizations/{locale}` 본문 — 레코드 전체를 바꾼다. 빠진 칸은 null(기본 언어 값으로 대체)이다.
55
+ * 옵션은 번역할 id만 보낸다. 상품에 없는 id는 400 `PRODUCT_LOCALIZATION_TARGET_NOT_FOUND`다.
56
+ * 번역한 옵션명·값 이름도 기본 언어와 같은 규칙(대소문자·앞뒤 공백 무시 유일)이고 겹치면 400 `INVALID_OPTION_MODEL`이다
57
+ */
58
+ export const productLocalizationRequestSchema = z.strictObject({
59
+ name: z.string().trim().min(1).max(100).nullable().optional(),
60
+ description: z.string().nullable().optional(),
61
+ descriptionJson: z.string().nullable().optional(),
62
+ images: z.array(productImageUrlSchema).min(1).max(MAX_PRODUCT_IMAGES).nullable().optional(),
63
+ optionGroups: z.array(translatedOptionGroupRequestSchema).optional(),
64
+ addonGroups: z.array(translatedOptionGroupRequestSchema).optional(),
65
+ customInputs: z
66
+ .array(
67
+ z.strictObject({
68
+ inputId: z.string(),
69
+ label: z.string().trim().min(1).max(30).nullable().optional(),
70
+ placeholder: z.string().trim().min(1).max(100).nullable().optional(),
71
+ }),
72
+ )
73
+ .optional(),
74
+ });
75
+
76
+ export type ProductLocalizationRequest = z.infer<typeof productLocalizationRequestSchema>;
@@ -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