@apps-in-toss/web-bridge 1.1.2 → 1.1.3

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/built/index.cjs CHANGED
@@ -117,17 +117,112 @@ var Storage = {
117
117
  };
118
118
 
119
119
  // src/iap.ts
120
+ var import_bridge_core3 = require("@apps-in-toss/bridge-core");
121
+
122
+ // src/isMinVersionSupported.ts
120
123
  var import_bridge_core2 = require("@apps-in-toss/bridge-core");
124
+
125
+ // src/utils/compareVersion.ts
126
+ var SEMVER_REGEX = /^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\\-]+(?:\.[\da-z\\-]+)*))?(?:\+[\da-z\\-]+(?:\.[\da-z\\-]+)*)?)?)?$/i;
127
+ var isWildcard = (val) => ["*", "x", "X"].includes(val);
128
+ var tryParse = (val) => {
129
+ const num = parseInt(val, 10);
130
+ return isNaN(num) ? val : num;
131
+ };
132
+ var coerceTypes = (a, b) => {
133
+ return typeof a === typeof b ? [a, b] : [String(a), String(b)];
134
+ };
135
+ var compareValues = (a, b) => {
136
+ if (isWildcard(a) || isWildcard(b)) {
137
+ return 0;
138
+ }
139
+ const [aVal, bVal] = coerceTypes(tryParse(a), tryParse(b));
140
+ if (aVal > bVal) {
141
+ return 1;
142
+ }
143
+ if (aVal < bVal) {
144
+ return -1;
145
+ }
146
+ return 0;
147
+ };
148
+ var parseVersion = (version) => {
149
+ if (typeof version !== "string") {
150
+ throw new TypeError("Invalid argument: expected a string");
151
+ }
152
+ const match = version.match(SEMVER_REGEX);
153
+ if (!match) {
154
+ throw new Error(`Invalid semver: '${version}'`);
155
+ }
156
+ const [, major, minor, patch, build, preRelease] = match;
157
+ return [major, minor, patch, build, preRelease];
158
+ };
159
+ var compareSegments = (a, b) => {
160
+ const maxLength = Math.max(a.length, b.length);
161
+ for (let i = 0; i < maxLength; i++) {
162
+ const segA = a[i] ?? "0";
163
+ const segB = b[i] ?? "0";
164
+ const result = compareValues(segA, segB);
165
+ if (result !== 0) {
166
+ return result;
167
+ }
168
+ }
169
+ return 0;
170
+ };
171
+ var compareVersions = (v1, v2) => {
172
+ const seg1 = parseVersion(v1);
173
+ const seg2 = parseVersion(v2);
174
+ const preRelease1 = seg1.pop();
175
+ const preRelease2 = seg2.pop();
176
+ const mainCompare = compareSegments(seg1, seg2);
177
+ if (mainCompare !== 0) {
178
+ return mainCompare;
179
+ }
180
+ if (preRelease1 && preRelease2) {
181
+ return compareSegments(preRelease1.split("."), preRelease2.split("."));
182
+ }
183
+ if (preRelease1) {
184
+ return -1;
185
+ }
186
+ if (preRelease2) {
187
+ return 1;
188
+ }
189
+ return 0;
190
+ };
191
+
192
+ // src/isMinVersionSupported.ts
193
+ function isMinVersionSupported(minVersions) {
194
+ const operationalEnvironment = (0, import_bridge_core2.createConstantBridge)("getOperationalEnvironment")();
195
+ if (operationalEnvironment === "sandbox") {
196
+ return true;
197
+ }
198
+ const currentVersion = (0, import_bridge_core2.createConstantBridge)("getTossAppVersion")();
199
+ const isIOS = (0, import_bridge_core2.createConstantBridge)("getPlatformOS")() === "ios";
200
+ const minVersion = isIOS ? minVersions.ios : minVersions.android;
201
+ if (minVersion === void 0) {
202
+ return false;
203
+ }
204
+ if (minVersion === "always") {
205
+ return true;
206
+ }
207
+ if (minVersion === "never") {
208
+ return false;
209
+ }
210
+ return compareVersions(currentVersion, minVersion) >= 0;
211
+ }
212
+
213
+ // src/iap.ts
214
+ function processProductGrant(params) {
215
+ return (0, import_bridge_core3.createAsyncBridge)("processProductGrant")(params);
216
+ }
121
217
  var IAP = {
122
218
  /**
123
219
  * @public
124
220
  * @category 인앱결제
125
- * @name iapCreateOneTimePurchaseOrder
221
+ * @name createOneTimePurchaseOrder
126
222
  * @description
127
223
  * 특정 인앱결제 주문서 페이지로 이동해요. 사용자가 상품 구매 버튼을 누르는 상황 등에 사용할 수 있어요. 사용자의 결제는 이동한 페이지에서 진행돼요. 만약 결제 중에 에러가 발생하면 에러 유형에 따라 에러 페이지로 이동해요.
128
224
  * @param {IapCreateOneTimePurchaseOrderOptions} params - 인앱결제를 생성할 때 필요한 정보예요.
129
- * @param {string} params.productId - 주문할 상품의 ID예요.
130
- * @returns {Promise<IapCreateOneTimePurchaseOrderResult | undefined>} 결제에 성공하면 결제 결과 객체를 반환해요. 앱 버전이 최소 지원 버전(안드로이드 5.219.0, iOS 5.219.0)보다 낮으면 인앱결제를 실행할 수 없어서 `undefined`를 반환해요.
225
+ * @returns {() => void} 앱브릿지 cleanup 함수를 반환해요. 인앱결제 기능이 끝나면 반드시 이 함수를 호출해서 리소스를 해제해야 해요.
131
226
  *
132
227
  * @throw {code: "INVALID_PRODUCT_ID"} - 유효하지 않은 상품 ID이거나, 해당 상품이 존재하지 않을 때 발생해요.
133
228
  * @throw {code: "PAYMENT_PENDING"} - 사용자가 요청한 결제가 아직 승인을 기다리고 있을 때 발생해요.
@@ -139,30 +234,82 @@ var IAP = {
139
234
  * @throw {code: "INTERNAL_ERROR"} - 서버 내부 문제로 요청을 처리할 수 없을 때 발생해요.
140
235
  * @throw {code: "KOREAN_ACCOUNT_ONLY"} - iOS 환경에서 사용자의 계정이 한국 계정이 아닐 때 발생해요.
141
236
  * @throw {code: "USER_CANCELED"} - 사용자가 결제를 완료하지 않고 주문서 페이지를 이탈했을 때 발생해요.
237
+ * @throw {code: "PRODUCT_NOT_GRANTED_BY_PARTNER"} - 파트너사의 상품 지급이 실패했을 때 발생해요.
142
238
  */
143
- createOneTimePurchaseOrder: (0, import_bridge_core2.createAsyncBridge)(
144
- "iapCreateOneTimePurchaseOrder"
145
- ),
239
+ createOneTimePurchaseOrder: (params) => {
240
+ const isIAPSupported = isMinVersionSupported({
241
+ android: "5.219.0",
242
+ ios: "5.219.0"
243
+ });
244
+ const noop = () => {
245
+ };
246
+ if (!isIAPSupported) {
247
+ return noop;
248
+ }
249
+ const isProcessProductGrantSupported = isMinVersionSupported({
250
+ android: "5.230.0",
251
+ ios: "5.230.0"
252
+ });
253
+ const { options, onEvent, onError } = params;
254
+ const sku = options.sku ?? options.productId;
255
+ if (!isProcessProductGrantSupported) {
256
+ const v1 = () => {
257
+ (0, import_bridge_core3.createAsyncBridge)(
258
+ "iapCreateOneTimePurchaseOrder"
259
+ )({
260
+ productId: sku
261
+ }).then((response) => {
262
+ Promise.resolve(options.processProductGrant({ orderId: response.orderId })).then(() => {
263
+ onEvent({ type: "success", data: response });
264
+ }).catch((error) => {
265
+ onError(error);
266
+ });
267
+ }).catch((error) => {
268
+ onError(error);
269
+ });
270
+ return noop;
271
+ };
272
+ return v1();
273
+ }
274
+ const unregisterCallbacks = (0, import_bridge_core3.createEventBridge)("requestOneTimePurchase")({
275
+ options: { sku },
276
+ onEvent: async (event) => {
277
+ if (event.type === "purchased") {
278
+ const isProductGranted = await options.processProductGrant({ orderId: event.data.orderId });
279
+ await processProductGrant({
280
+ orderId: event.data.orderId,
281
+ isProductGranted
282
+ }).catch(onError);
283
+ } else {
284
+ onEvent(event);
285
+ }
286
+ },
287
+ onError: (error) => {
288
+ onError(error);
289
+ }
290
+ });
291
+ return unregisterCallbacks;
292
+ },
146
293
  /**
147
294
  * @public
148
295
  * @category 인앱결제
149
- * @name iapGetProductItemList
296
+ * @name getProductItemList
150
297
  * @description 인앱결제로 구매할 수 있는 상품 목록을 가져와요. 상품 목록 화면에 진입할 때 호출해요.
151
298
  * @returns {Promise<{ products: IapProductListItem[] } | undefined>} 상품 목록을 포함한 객체를 반환해요. 앱 버전이 최소 지원 버전(안드로이드 5.219.0, iOS 5.219.0)보다 낮으면 `undefined`를 반환해요.
152
299
  */
153
- getProductItemList: (0, import_bridge_core2.createAsyncBridge)("iapGetProductItemList")
300
+ getProductItemList: (0, import_bridge_core3.createAsyncBridge)("iapGetProductItemList")
154
301
  };
155
302
 
156
303
  // src/getSafeAreaInsets.ts
157
- var import_bridge_core3 = require("@apps-in-toss/bridge-core");
158
- var getSafeAreaBottom = (0, import_bridge_core3.createConstantBridge)("getSafeAreaBottom");
159
- var getSafeAreaTop = (0, import_bridge_core3.createConstantBridge)("getSafeAreaTop");
304
+ var import_bridge_core4 = require("@apps-in-toss/bridge-core");
305
+ var getSafeAreaBottom = (0, import_bridge_core4.createConstantBridge)("getSafeAreaBottom");
306
+ var getSafeAreaTop = (0, import_bridge_core4.createConstantBridge)("getSafeAreaTop");
160
307
  function getSafeAreaInsets() {
161
308
  return { top: getSafeAreaTop(), bottom: getSafeAreaBottom() };
162
309
  }
163
310
 
164
311
  // src/googleAdMob.ts
165
- var import_bridge_core4 = require("@apps-in-toss/bridge-core");
312
+ var import_bridge_core5 = require("@apps-in-toss/bridge-core");
166
313
  var GoogleAdMob = {
167
314
  /**
168
315
  * @public
@@ -213,9 +360,9 @@ var GoogleAdMob = {
213
360
  * ```
214
361
  */
215
362
  loadAdMobInterstitialAd: Object.assign(
216
- (0, import_bridge_core4.createEventBridge)("loadAdMobInterstitialAd"),
363
+ (0, import_bridge_core5.createEventBridge)("loadAdMobInterstitialAd"),
217
364
  {
218
- isSupported: (0, import_bridge_core4.createConstantBridge)("loadAdMobInterstitialAd_isSupported")
365
+ isSupported: (0, import_bridge_core5.createConstantBridge)("loadAdMobInterstitialAd_isSupported")
219
366
  }
220
367
  ),
221
368
  /**
@@ -288,9 +435,9 @@ var GoogleAdMob = {
288
435
  * ```
289
436
  */
290
437
  showAdMobInterstitialAd: Object.assign(
291
- (0, import_bridge_core4.createEventBridge)("showAdMobInterstitialAd"),
438
+ (0, import_bridge_core5.createEventBridge)("showAdMobInterstitialAd"),
292
439
  {
293
- isSupported: (0, import_bridge_core4.createConstantBridge)("showAdMobInterstitialAd_isSupported")
440
+ isSupported: (0, import_bridge_core5.createConstantBridge)("showAdMobInterstitialAd_isSupported")
294
441
  }
295
442
  ),
296
443
  /**
@@ -342,9 +489,9 @@ var GoogleAdMob = {
342
489
  * ```
343
490
  */
344
491
  loadAdMobRewardedAd: Object.assign(
345
- (0, import_bridge_core4.createEventBridge)("loadAdMobRewardedAd"),
492
+ (0, import_bridge_core5.createEventBridge)("loadAdMobRewardedAd"),
346
493
  {
347
- isSupported: (0, import_bridge_core4.createConstantBridge)("loadAdMobRewardedAd_isSupported")
494
+ isSupported: (0, import_bridge_core5.createConstantBridge)("loadAdMobRewardedAd_isSupported")
348
495
  }
349
496
  ),
350
497
  /**
@@ -417,9 +564,9 @@ var GoogleAdMob = {
417
564
  * ```
418
565
  */
419
566
  showAdMobRewardedAd: Object.assign(
420
- (0, import_bridge_core4.createEventBridge)("showAdMobRewardedAd"),
567
+ (0, import_bridge_core5.createEventBridge)("showAdMobRewardedAd"),
421
568
  {
422
- isSupported: (0, import_bridge_core4.createConstantBridge)("showAdMobRewardedAd_isSupported")
569
+ isSupported: (0, import_bridge_core5.createConstantBridge)("showAdMobRewardedAd_isSupported")
423
570
  }
424
571
  ),
425
572
  /**
@@ -476,8 +623,8 @@ var GoogleAdMob = {
476
623
  * }
477
624
  * ```
478
625
  */
479
- loadAppsInTossAdMob: Object.assign((0, import_bridge_core4.createEventBridge)("loadAppsInTossAdMob"), {
480
- isSupported: (0, import_bridge_core4.createConstantBridge)("loadAppsInTossAdMob_isSupported")
626
+ loadAppsInTossAdMob: Object.assign((0, import_bridge_core5.createEventBridge)("loadAppsInTossAdMob"), {
627
+ isSupported: (0, import_bridge_core5.createConstantBridge)("loadAppsInTossAdMob_isSupported")
481
628
  }),
482
629
  /**
483
630
  * @public
@@ -554,19 +701,19 @@ var GoogleAdMob = {
554
701
  * }
555
702
  * ```
556
703
  */
557
- showAppsInTossAdMob: Object.assign((0, import_bridge_core4.createEventBridge)("showAppsInTossAdMob"), {
558
- isSupported: (0, import_bridge_core4.createConstantBridge)("showAppsInTossAdMob_isSupported")
704
+ showAppsInTossAdMob: Object.assign((0, import_bridge_core5.createEventBridge)("showAppsInTossAdMob"), {
705
+ isSupported: (0, import_bridge_core5.createConstantBridge)("showAppsInTossAdMob_isSupported")
559
706
  })
560
707
  };
561
708
 
562
709
  // src/graniteEvent.ts
563
- var import_bridge_core5 = require("@apps-in-toss/bridge-core");
710
+ var import_bridge_core6 = require("@apps-in-toss/bridge-core");
564
711
  var graniteEvent = {
565
712
  addEventListener: (event, {
566
713
  onEvent,
567
714
  onError,
568
715
  options
569
- }) => (0, import_bridge_core5.createEventBridge)(event)({
716
+ }) => (0, import_bridge_core6.createEventBridge)(event)({
570
717
  onEvent,
571
718
  onError: onError ?? (() => {
572
719
  }),
@@ -574,97 +721,6 @@ var graniteEvent = {
574
721
  })
575
722
  };
576
723
 
577
- // src/isMinVersionSupported.ts
578
- var import_bridge_core6 = require("@apps-in-toss/bridge-core");
579
-
580
- // src/utils/compareVersion.ts
581
- var SEMVER_REGEX = /^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\\-]+(?:\.[\da-z\\-]+)*))?(?:\+[\da-z\\-]+(?:\.[\da-z\\-]+)*)?)?)?$/i;
582
- var isWildcard = (val) => ["*", "x", "X"].includes(val);
583
- var tryParse = (val) => {
584
- const num = parseInt(val, 10);
585
- return isNaN(num) ? val : num;
586
- };
587
- var coerceTypes = (a, b) => {
588
- return typeof a === typeof b ? [a, b] : [String(a), String(b)];
589
- };
590
- var compareValues = (a, b) => {
591
- if (isWildcard(a) || isWildcard(b)) {
592
- return 0;
593
- }
594
- const [aVal, bVal] = coerceTypes(tryParse(a), tryParse(b));
595
- if (aVal > bVal) {
596
- return 1;
597
- }
598
- if (aVal < bVal) {
599
- return -1;
600
- }
601
- return 0;
602
- };
603
- var parseVersion = (version) => {
604
- if (typeof version !== "string") {
605
- throw new TypeError("Invalid argument: expected a string");
606
- }
607
- const match = version.match(SEMVER_REGEX);
608
- if (!match) {
609
- throw new Error(`Invalid semver: '${version}'`);
610
- }
611
- const [, major, minor, patch, build, preRelease] = match;
612
- return [major, minor, patch, build, preRelease];
613
- };
614
- var compareSegments = (a, b) => {
615
- const maxLength = Math.max(a.length, b.length);
616
- for (let i = 0; i < maxLength; i++) {
617
- const segA = a[i] ?? "0";
618
- const segB = b[i] ?? "0";
619
- const result = compareValues(segA, segB);
620
- if (result !== 0) {
621
- return result;
622
- }
623
- }
624
- return 0;
625
- };
626
- var compareVersions = (v1, v2) => {
627
- const seg1 = parseVersion(v1);
628
- const seg2 = parseVersion(v2);
629
- const preRelease1 = seg1.pop();
630
- const preRelease2 = seg2.pop();
631
- const mainCompare = compareSegments(seg1, seg2);
632
- if (mainCompare !== 0) {
633
- return mainCompare;
634
- }
635
- if (preRelease1 && preRelease2) {
636
- return compareSegments(preRelease1.split("."), preRelease2.split("."));
637
- }
638
- if (preRelease1) {
639
- return -1;
640
- }
641
- if (preRelease2) {
642
- return 1;
643
- }
644
- return 0;
645
- };
646
-
647
- // src/isMinVersionSupported.ts
648
- function isMinVersionSupported(minVersions) {
649
- const operationalEnvironment = (0, import_bridge_core6.createConstantBridge)("getOperationalEnvironment")();
650
- if (operationalEnvironment === "sandbox") {
651
- return true;
652
- }
653
- const currentVersion = (0, import_bridge_core6.createConstantBridge)("getTossAppVersion")();
654
- const isIOS = (0, import_bridge_core6.createConstantBridge)("getPlatformOS")() === "ios";
655
- const minVersion = isIOS ? minVersions.ios : minVersions.android;
656
- if (minVersion === void 0) {
657
- return false;
658
- }
659
- if (minVersion === "always") {
660
- return true;
661
- }
662
- if (minVersion === "never") {
663
- return false;
664
- }
665
- return compareVersions(currentVersion, minVersion) >= 0;
666
- }
667
-
668
724
  // src/appsInTossEvent.ts
669
725
  var import_bridge_core7 = require("@apps-in-toss/bridge-core");
670
726
  var appsInTossEvent = {
package/built/index.d.cts CHANGED
@@ -85,6 +85,16 @@ declare const Storage: {
85
85
  clearItems: (args_0: void) => Promise<void>;
86
86
  };
87
87
 
88
+ type Sku = {
89
+ /**
90
+ * @deprecated `productId`는 더 이상 사용하지 않아요. 대신 `sku`를 사용해요.
91
+ */
92
+ productId: string;
93
+ sku?: string;
94
+ } | {
95
+ productId?: never;
96
+ sku: string;
97
+ };
88
98
  /**
89
99
  * @public
90
100
  * @category 인앱결제
@@ -107,6 +117,29 @@ interface IapCreateOneTimePurchaseOrderResult {
107
117
  fraction: number;
108
118
  miniAppIconUrl: string | null;
109
119
  }
120
+ interface SuccessEvent {
121
+ type: 'success';
122
+ data: IapCreateOneTimePurchaseOrderResult;
123
+ }
124
+ /**
125
+ * @public
126
+ * @category 인앱결제
127
+ * @name IapCreateOneTimePurchaseOrderOptions
128
+ * @property {Sku} options - 결제할 상품의 정보예요.
129
+ * @property {string} options.sku - 주문할 상품의 고유 ID예요.
130
+ * @property {(params: { orderId: string }) => boolean | Promise<boolean>} processProductGrant - 주문이 만들어진 뒤 실제로 상품을 지급할 때 호출해요. `orderId`를 받아서 지급 성공 여부를 `true` 또는 `Promise<true>`로 반환해요. 지급에 실패하면 `false`를 반환해요.
131
+ * @property {(event: SuccessEvent) => void | Promise<void>} onEvent - 결제가 성공했을 때 호출해요. `event.type`이 `'success'`이고, `event.data`에 `IapCreateOneTimePurchaseOrderResult`가 들어 있어요.
132
+ * @property {(error: unknown) => void | Promise<void>} onError - 결제 과정에서 에러가 발생했을 때 호출해요. 에러 객체를 받아서 로깅하거나 복구 절차를 실행할 수 있어요.
133
+ */
134
+ interface IapCreateOneTimePurchaseOrderOptions {
135
+ options: Sku & {
136
+ processProductGrant: (params: {
137
+ orderId: string;
138
+ }) => boolean | Promise<boolean>;
139
+ };
140
+ onEvent: (event: SuccessEvent) => void | Promise<void>;
141
+ onError: (error: unknown) => void | Promise<void>;
142
+ }
110
143
  /**
111
144
  * @public
112
145
  * @category 인앱결제
@@ -137,12 +170,11 @@ declare const IAP: {
137
170
  /**
138
171
  * @public
139
172
  * @category 인앱결제
140
- * @name iapCreateOneTimePurchaseOrder
173
+ * @name createOneTimePurchaseOrder
141
174
  * @description
142
175
  * 특정 인앱결제 주문서 페이지로 이동해요. 사용자가 상품 구매 버튼을 누르는 상황 등에 사용할 수 있어요. 사용자의 결제는 이동한 페이지에서 진행돼요. 만약 결제 중에 에러가 발생하면 에러 유형에 따라 에러 페이지로 이동해요.
143
176
  * @param {IapCreateOneTimePurchaseOrderOptions} params - 인앱결제를 생성할 때 필요한 정보예요.
144
- * @param {string} params.productId - 주문할 상품의 ID예요.
145
- * @returns {Promise<IapCreateOneTimePurchaseOrderResult | undefined>} 결제에 성공하면 결제 결과 객체를 반환해요. 앱 버전이 최소 지원 버전(안드로이드 5.219.0, iOS 5.219.0)보다 낮으면 인앱결제를 실행할 수 없어서 `undefined`를 반환해요.
177
+ * @returns {() => void} 앱브릿지 cleanup 함수를 반환해요. 인앱결제 기능이 끝나면 반드시 이 함수를 호출해서 리소스를 해제해야 해요.
146
178
  *
147
179
  * @throw {code: "INVALID_PRODUCT_ID"} - 유효하지 않은 상품 ID이거나, 해당 상품이 존재하지 않을 때 발생해요.
148
180
  * @throw {code: "PAYMENT_PENDING"} - 사용자가 요청한 결제가 아직 승인을 기다리고 있을 때 발생해요.
@@ -154,14 +186,13 @@ declare const IAP: {
154
186
  * @throw {code: "INTERNAL_ERROR"} - 서버 내부 문제로 요청을 처리할 수 없을 때 발생해요.
155
187
  * @throw {code: "KOREAN_ACCOUNT_ONLY"} - iOS 환경에서 사용자의 계정이 한국 계정이 아닐 때 발생해요.
156
188
  * @throw {code: "USER_CANCELED"} - 사용자가 결제를 완료하지 않고 주문서 페이지를 이탈했을 때 발생해요.
189
+ * @throw {code: "PRODUCT_NOT_GRANTED_BY_PARTNER"} - 파트너사의 상품 지급이 실패했을 때 발생해요.
157
190
  */
158
- createOneTimePurchaseOrder: (args_0: {
159
- productId: string;
160
- }) => Promise<IapCreateOneTimePurchaseOrderResult>;
191
+ createOneTimePurchaseOrder: (params: IapCreateOneTimePurchaseOrderOptions) => () => void;
161
192
  /**
162
193
  * @public
163
194
  * @category 인앱결제
164
- * @name iapGetProductItemList
195
+ * @name getProductItemList
165
196
  * @description 인앱결제로 구매할 수 있는 상품 목록을 가져와요. 상품 목록 화면에 진입할 때 호출해요.
166
197
  * @returns {Promise<{ products: IapProductListItem[] } | undefined>} 상품 목록을 포함한 객체를 반환해요. 앱 버전이 최소 지원 버전(안드로이드 5.219.0, iOS 5.219.0)보다 낮으면 `undefined`를 반환해요.
167
198
  */
@@ -787,4 +818,4 @@ declare const startUpdateLocation: {
787
818
  openPermissionDialog(): Promise<"denied" | "allowed">;
788
819
  };
789
820
 
790
- export { type AddAccessoryButtonOptions, type AppsInTossEvent, type AppsInTossGlobals, GoogleAdMob, type GraniteEvent, IAP, type IapCreateOneTimePurchaseOrderResult, type IapProductListItem, Storage, type TdsEvent, appsInTossEvent, env, fetchAlbumPhotos, fetchContacts, getAppsInTossGlobals, getClipboardText, getCurrentLocation, getSafeAreaInsets, graniteEvent, isMinVersionSupported, openCamera, partner, setClipboardText, startUpdateLocation, tdsEvent };
821
+ export { type AddAccessoryButtonOptions, type AppsInTossEvent, type AppsInTossGlobals, GoogleAdMob, type GraniteEvent, IAP, type IapCreateOneTimePurchaseOrderOptions, type IapProductListItem, Storage, type TdsEvent, appsInTossEvent, env, fetchAlbumPhotos, fetchContacts, getAppsInTossGlobals, getClipboardText, getCurrentLocation, getSafeAreaInsets, graniteEvent, isMinVersionSupported, openCamera, partner, setClipboardText, startUpdateLocation, tdsEvent };
package/built/index.d.ts CHANGED
@@ -85,6 +85,16 @@ declare const Storage: {
85
85
  clearItems: (args_0: void) => Promise<void>;
86
86
  };
87
87
 
88
+ type Sku = {
89
+ /**
90
+ * @deprecated `productId`는 더 이상 사용하지 않아요. 대신 `sku`를 사용해요.
91
+ */
92
+ productId: string;
93
+ sku?: string;
94
+ } | {
95
+ productId?: never;
96
+ sku: string;
97
+ };
88
98
  /**
89
99
  * @public
90
100
  * @category 인앱결제
@@ -107,6 +117,29 @@ interface IapCreateOneTimePurchaseOrderResult {
107
117
  fraction: number;
108
118
  miniAppIconUrl: string | null;
109
119
  }
120
+ interface SuccessEvent {
121
+ type: 'success';
122
+ data: IapCreateOneTimePurchaseOrderResult;
123
+ }
124
+ /**
125
+ * @public
126
+ * @category 인앱결제
127
+ * @name IapCreateOneTimePurchaseOrderOptions
128
+ * @property {Sku} options - 결제할 상품의 정보예요.
129
+ * @property {string} options.sku - 주문할 상품의 고유 ID예요.
130
+ * @property {(params: { orderId: string }) => boolean | Promise<boolean>} processProductGrant - 주문이 만들어진 뒤 실제로 상품을 지급할 때 호출해요. `orderId`를 받아서 지급 성공 여부를 `true` 또는 `Promise<true>`로 반환해요. 지급에 실패하면 `false`를 반환해요.
131
+ * @property {(event: SuccessEvent) => void | Promise<void>} onEvent - 결제가 성공했을 때 호출해요. `event.type`이 `'success'`이고, `event.data`에 `IapCreateOneTimePurchaseOrderResult`가 들어 있어요.
132
+ * @property {(error: unknown) => void | Promise<void>} onError - 결제 과정에서 에러가 발생했을 때 호출해요. 에러 객체를 받아서 로깅하거나 복구 절차를 실행할 수 있어요.
133
+ */
134
+ interface IapCreateOneTimePurchaseOrderOptions {
135
+ options: Sku & {
136
+ processProductGrant: (params: {
137
+ orderId: string;
138
+ }) => boolean | Promise<boolean>;
139
+ };
140
+ onEvent: (event: SuccessEvent) => void | Promise<void>;
141
+ onError: (error: unknown) => void | Promise<void>;
142
+ }
110
143
  /**
111
144
  * @public
112
145
  * @category 인앱결제
@@ -137,12 +170,11 @@ declare const IAP: {
137
170
  /**
138
171
  * @public
139
172
  * @category 인앱결제
140
- * @name iapCreateOneTimePurchaseOrder
173
+ * @name createOneTimePurchaseOrder
141
174
  * @description
142
175
  * 특정 인앱결제 주문서 페이지로 이동해요. 사용자가 상품 구매 버튼을 누르는 상황 등에 사용할 수 있어요. 사용자의 결제는 이동한 페이지에서 진행돼요. 만약 결제 중에 에러가 발생하면 에러 유형에 따라 에러 페이지로 이동해요.
143
176
  * @param {IapCreateOneTimePurchaseOrderOptions} params - 인앱결제를 생성할 때 필요한 정보예요.
144
- * @param {string} params.productId - 주문할 상품의 ID예요.
145
- * @returns {Promise<IapCreateOneTimePurchaseOrderResult | undefined>} 결제에 성공하면 결제 결과 객체를 반환해요. 앱 버전이 최소 지원 버전(안드로이드 5.219.0, iOS 5.219.0)보다 낮으면 인앱결제를 실행할 수 없어서 `undefined`를 반환해요.
177
+ * @returns {() => void} 앱브릿지 cleanup 함수를 반환해요. 인앱결제 기능이 끝나면 반드시 이 함수를 호출해서 리소스를 해제해야 해요.
146
178
  *
147
179
  * @throw {code: "INVALID_PRODUCT_ID"} - 유효하지 않은 상품 ID이거나, 해당 상품이 존재하지 않을 때 발생해요.
148
180
  * @throw {code: "PAYMENT_PENDING"} - 사용자가 요청한 결제가 아직 승인을 기다리고 있을 때 발생해요.
@@ -154,14 +186,13 @@ declare const IAP: {
154
186
  * @throw {code: "INTERNAL_ERROR"} - 서버 내부 문제로 요청을 처리할 수 없을 때 발생해요.
155
187
  * @throw {code: "KOREAN_ACCOUNT_ONLY"} - iOS 환경에서 사용자의 계정이 한국 계정이 아닐 때 발생해요.
156
188
  * @throw {code: "USER_CANCELED"} - 사용자가 결제를 완료하지 않고 주문서 페이지를 이탈했을 때 발생해요.
189
+ * @throw {code: "PRODUCT_NOT_GRANTED_BY_PARTNER"} - 파트너사의 상품 지급이 실패했을 때 발생해요.
157
190
  */
158
- createOneTimePurchaseOrder: (args_0: {
159
- productId: string;
160
- }) => Promise<IapCreateOneTimePurchaseOrderResult>;
191
+ createOneTimePurchaseOrder: (params: IapCreateOneTimePurchaseOrderOptions) => () => void;
161
192
  /**
162
193
  * @public
163
194
  * @category 인앱결제
164
- * @name iapGetProductItemList
195
+ * @name getProductItemList
165
196
  * @description 인앱결제로 구매할 수 있는 상품 목록을 가져와요. 상품 목록 화면에 진입할 때 호출해요.
166
197
  * @returns {Promise<{ products: IapProductListItem[] } | undefined>} 상품 목록을 포함한 객체를 반환해요. 앱 버전이 최소 지원 버전(안드로이드 5.219.0, iOS 5.219.0)보다 낮으면 `undefined`를 반환해요.
167
198
  */
@@ -787,4 +818,4 @@ declare const startUpdateLocation: {
787
818
  openPermissionDialog(): Promise<"denied" | "allowed">;
788
819
  };
789
820
 
790
- export { type AddAccessoryButtonOptions, type AppsInTossEvent, type AppsInTossGlobals, GoogleAdMob, type GraniteEvent, IAP, type IapCreateOneTimePurchaseOrderResult, type IapProductListItem, Storage, type TdsEvent, appsInTossEvent, env, fetchAlbumPhotos, fetchContacts, getAppsInTossGlobals, getClipboardText, getCurrentLocation, getSafeAreaInsets, graniteEvent, isMinVersionSupported, openCamera, partner, setClipboardText, startUpdateLocation, tdsEvent };
821
+ export { type AddAccessoryButtonOptions, type AppsInTossEvent, type AppsInTossGlobals, GoogleAdMob, type GraniteEvent, IAP, type IapCreateOneTimePurchaseOrderOptions, type IapProductListItem, Storage, type TdsEvent, appsInTossEvent, env, fetchAlbumPhotos, fetchContacts, getAppsInTossGlobals, getClipboardText, getCurrentLocation, getSafeAreaInsets, graniteEvent, isMinVersionSupported, openCamera, partner, setClipboardText, startUpdateLocation, tdsEvent };
package/built/index.js CHANGED
@@ -76,17 +76,112 @@ var Storage = {
76
76
  };
77
77
 
78
78
  // src/iap.ts
79
- import { createAsyncBridge as createAsyncBridge2 } from "@apps-in-toss/bridge-core";
79
+ import { createAsyncBridge as createAsyncBridge2, createEventBridge } from "@apps-in-toss/bridge-core";
80
+
81
+ // src/isMinVersionSupported.ts
82
+ import { createConstantBridge } from "@apps-in-toss/bridge-core";
83
+
84
+ // src/utils/compareVersion.ts
85
+ var SEMVER_REGEX = /^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\\-]+(?:\.[\da-z\\-]+)*))?(?:\+[\da-z\\-]+(?:\.[\da-z\\-]+)*)?)?)?$/i;
86
+ var isWildcard = (val) => ["*", "x", "X"].includes(val);
87
+ var tryParse = (val) => {
88
+ const num = parseInt(val, 10);
89
+ return isNaN(num) ? val : num;
90
+ };
91
+ var coerceTypes = (a, b) => {
92
+ return typeof a === typeof b ? [a, b] : [String(a), String(b)];
93
+ };
94
+ var compareValues = (a, b) => {
95
+ if (isWildcard(a) || isWildcard(b)) {
96
+ return 0;
97
+ }
98
+ const [aVal, bVal] = coerceTypes(tryParse(a), tryParse(b));
99
+ if (aVal > bVal) {
100
+ return 1;
101
+ }
102
+ if (aVal < bVal) {
103
+ return -1;
104
+ }
105
+ return 0;
106
+ };
107
+ var parseVersion = (version) => {
108
+ if (typeof version !== "string") {
109
+ throw new TypeError("Invalid argument: expected a string");
110
+ }
111
+ const match = version.match(SEMVER_REGEX);
112
+ if (!match) {
113
+ throw new Error(`Invalid semver: '${version}'`);
114
+ }
115
+ const [, major, minor, patch, build, preRelease] = match;
116
+ return [major, minor, patch, build, preRelease];
117
+ };
118
+ var compareSegments = (a, b) => {
119
+ const maxLength = Math.max(a.length, b.length);
120
+ for (let i = 0; i < maxLength; i++) {
121
+ const segA = a[i] ?? "0";
122
+ const segB = b[i] ?? "0";
123
+ const result = compareValues(segA, segB);
124
+ if (result !== 0) {
125
+ return result;
126
+ }
127
+ }
128
+ return 0;
129
+ };
130
+ var compareVersions = (v1, v2) => {
131
+ const seg1 = parseVersion(v1);
132
+ const seg2 = parseVersion(v2);
133
+ const preRelease1 = seg1.pop();
134
+ const preRelease2 = seg2.pop();
135
+ const mainCompare = compareSegments(seg1, seg2);
136
+ if (mainCompare !== 0) {
137
+ return mainCompare;
138
+ }
139
+ if (preRelease1 && preRelease2) {
140
+ return compareSegments(preRelease1.split("."), preRelease2.split("."));
141
+ }
142
+ if (preRelease1) {
143
+ return -1;
144
+ }
145
+ if (preRelease2) {
146
+ return 1;
147
+ }
148
+ return 0;
149
+ };
150
+
151
+ // src/isMinVersionSupported.ts
152
+ function isMinVersionSupported(minVersions) {
153
+ const operationalEnvironment = createConstantBridge("getOperationalEnvironment")();
154
+ if (operationalEnvironment === "sandbox") {
155
+ return true;
156
+ }
157
+ const currentVersion = createConstantBridge("getTossAppVersion")();
158
+ const isIOS = createConstantBridge("getPlatformOS")() === "ios";
159
+ const minVersion = isIOS ? minVersions.ios : minVersions.android;
160
+ if (minVersion === void 0) {
161
+ return false;
162
+ }
163
+ if (minVersion === "always") {
164
+ return true;
165
+ }
166
+ if (minVersion === "never") {
167
+ return false;
168
+ }
169
+ return compareVersions(currentVersion, minVersion) >= 0;
170
+ }
171
+
172
+ // src/iap.ts
173
+ function processProductGrant(params) {
174
+ return createAsyncBridge2("processProductGrant")(params);
175
+ }
80
176
  var IAP = {
81
177
  /**
82
178
  * @public
83
179
  * @category 인앱결제
84
- * @name iapCreateOneTimePurchaseOrder
180
+ * @name createOneTimePurchaseOrder
85
181
  * @description
86
182
  * 특정 인앱결제 주문서 페이지로 이동해요. 사용자가 상품 구매 버튼을 누르는 상황 등에 사용할 수 있어요. 사용자의 결제는 이동한 페이지에서 진행돼요. 만약 결제 중에 에러가 발생하면 에러 유형에 따라 에러 페이지로 이동해요.
87
183
  * @param {IapCreateOneTimePurchaseOrderOptions} params - 인앱결제를 생성할 때 필요한 정보예요.
88
- * @param {string} params.productId - 주문할 상품의 ID예요.
89
- * @returns {Promise<IapCreateOneTimePurchaseOrderResult | undefined>} 결제에 성공하면 결제 결과 객체를 반환해요. 앱 버전이 최소 지원 버전(안드로이드 5.219.0, iOS 5.219.0)보다 낮으면 인앱결제를 실행할 수 없어서 `undefined`를 반환해요.
184
+ * @returns {() => void} 앱브릿지 cleanup 함수를 반환해요. 인앱결제 기능이 끝나면 반드시 이 함수를 호출해서 리소스를 해제해야 해요.
90
185
  *
91
186
  * @throw {code: "INVALID_PRODUCT_ID"} - 유효하지 않은 상품 ID이거나, 해당 상품이 존재하지 않을 때 발생해요.
92
187
  * @throw {code: "PAYMENT_PENDING"} - 사용자가 요청한 결제가 아직 승인을 기다리고 있을 때 발생해요.
@@ -98,14 +193,66 @@ var IAP = {
98
193
  * @throw {code: "INTERNAL_ERROR"} - 서버 내부 문제로 요청을 처리할 수 없을 때 발생해요.
99
194
  * @throw {code: "KOREAN_ACCOUNT_ONLY"} - iOS 환경에서 사용자의 계정이 한국 계정이 아닐 때 발생해요.
100
195
  * @throw {code: "USER_CANCELED"} - 사용자가 결제를 완료하지 않고 주문서 페이지를 이탈했을 때 발생해요.
196
+ * @throw {code: "PRODUCT_NOT_GRANTED_BY_PARTNER"} - 파트너사의 상품 지급이 실패했을 때 발생해요.
101
197
  */
102
- createOneTimePurchaseOrder: createAsyncBridge2(
103
- "iapCreateOneTimePurchaseOrder"
104
- ),
198
+ createOneTimePurchaseOrder: (params) => {
199
+ const isIAPSupported = isMinVersionSupported({
200
+ android: "5.219.0",
201
+ ios: "5.219.0"
202
+ });
203
+ const noop = () => {
204
+ };
205
+ if (!isIAPSupported) {
206
+ return noop;
207
+ }
208
+ const isProcessProductGrantSupported = isMinVersionSupported({
209
+ android: "5.230.0",
210
+ ios: "5.230.0"
211
+ });
212
+ const { options, onEvent, onError } = params;
213
+ const sku = options.sku ?? options.productId;
214
+ if (!isProcessProductGrantSupported) {
215
+ const v1 = () => {
216
+ createAsyncBridge2(
217
+ "iapCreateOneTimePurchaseOrder"
218
+ )({
219
+ productId: sku
220
+ }).then((response) => {
221
+ Promise.resolve(options.processProductGrant({ orderId: response.orderId })).then(() => {
222
+ onEvent({ type: "success", data: response });
223
+ }).catch((error) => {
224
+ onError(error);
225
+ });
226
+ }).catch((error) => {
227
+ onError(error);
228
+ });
229
+ return noop;
230
+ };
231
+ return v1();
232
+ }
233
+ const unregisterCallbacks = createEventBridge("requestOneTimePurchase")({
234
+ options: { sku },
235
+ onEvent: async (event) => {
236
+ if (event.type === "purchased") {
237
+ const isProductGranted = await options.processProductGrant({ orderId: event.data.orderId });
238
+ await processProductGrant({
239
+ orderId: event.data.orderId,
240
+ isProductGranted
241
+ }).catch(onError);
242
+ } else {
243
+ onEvent(event);
244
+ }
245
+ },
246
+ onError: (error) => {
247
+ onError(error);
248
+ }
249
+ });
250
+ return unregisterCallbacks;
251
+ },
105
252
  /**
106
253
  * @public
107
254
  * @category 인앱결제
108
- * @name iapGetProductItemList
255
+ * @name getProductItemList
109
256
  * @description 인앱결제로 구매할 수 있는 상품 목록을 가져와요. 상품 목록 화면에 진입할 때 호출해요.
110
257
  * @returns {Promise<{ products: IapProductListItem[] } | undefined>} 상품 목록을 포함한 객체를 반환해요. 앱 버전이 최소 지원 버전(안드로이드 5.219.0, iOS 5.219.0)보다 낮으면 `undefined`를 반환해요.
111
258
  */
@@ -113,15 +260,15 @@ var IAP = {
113
260
  };
114
261
 
115
262
  // src/getSafeAreaInsets.ts
116
- import { createConstantBridge } from "@apps-in-toss/bridge-core";
117
- var getSafeAreaBottom = createConstantBridge("getSafeAreaBottom");
118
- var getSafeAreaTop = createConstantBridge("getSafeAreaTop");
263
+ import { createConstantBridge as createConstantBridge2 } from "@apps-in-toss/bridge-core";
264
+ var getSafeAreaBottom = createConstantBridge2("getSafeAreaBottom");
265
+ var getSafeAreaTop = createConstantBridge2("getSafeAreaTop");
119
266
  function getSafeAreaInsets() {
120
267
  return { top: getSafeAreaTop(), bottom: getSafeAreaBottom() };
121
268
  }
122
269
 
123
270
  // src/googleAdMob.ts
124
- import { createConstantBridge as createConstantBridge2, createEventBridge } from "@apps-in-toss/bridge-core";
271
+ import { createConstantBridge as createConstantBridge3, createEventBridge as createEventBridge2 } from "@apps-in-toss/bridge-core";
125
272
  var GoogleAdMob = {
126
273
  /**
127
274
  * @public
@@ -172,9 +319,9 @@ var GoogleAdMob = {
172
319
  * ```
173
320
  */
174
321
  loadAdMobInterstitialAd: Object.assign(
175
- createEventBridge("loadAdMobInterstitialAd"),
322
+ createEventBridge2("loadAdMobInterstitialAd"),
176
323
  {
177
- isSupported: createConstantBridge2("loadAdMobInterstitialAd_isSupported")
324
+ isSupported: createConstantBridge3("loadAdMobInterstitialAd_isSupported")
178
325
  }
179
326
  ),
180
327
  /**
@@ -247,9 +394,9 @@ var GoogleAdMob = {
247
394
  * ```
248
395
  */
249
396
  showAdMobInterstitialAd: Object.assign(
250
- createEventBridge("showAdMobInterstitialAd"),
397
+ createEventBridge2("showAdMobInterstitialAd"),
251
398
  {
252
- isSupported: createConstantBridge2("showAdMobInterstitialAd_isSupported")
399
+ isSupported: createConstantBridge3("showAdMobInterstitialAd_isSupported")
253
400
  }
254
401
  ),
255
402
  /**
@@ -301,9 +448,9 @@ var GoogleAdMob = {
301
448
  * ```
302
449
  */
303
450
  loadAdMobRewardedAd: Object.assign(
304
- createEventBridge("loadAdMobRewardedAd"),
451
+ createEventBridge2("loadAdMobRewardedAd"),
305
452
  {
306
- isSupported: createConstantBridge2("loadAdMobRewardedAd_isSupported")
453
+ isSupported: createConstantBridge3("loadAdMobRewardedAd_isSupported")
307
454
  }
308
455
  ),
309
456
  /**
@@ -376,9 +523,9 @@ var GoogleAdMob = {
376
523
  * ```
377
524
  */
378
525
  showAdMobRewardedAd: Object.assign(
379
- createEventBridge("showAdMobRewardedAd"),
526
+ createEventBridge2("showAdMobRewardedAd"),
380
527
  {
381
- isSupported: createConstantBridge2("showAdMobRewardedAd_isSupported")
528
+ isSupported: createConstantBridge3("showAdMobRewardedAd_isSupported")
382
529
  }
383
530
  ),
384
531
  /**
@@ -435,8 +582,8 @@ var GoogleAdMob = {
435
582
  * }
436
583
  * ```
437
584
  */
438
- loadAppsInTossAdMob: Object.assign(createEventBridge("loadAppsInTossAdMob"), {
439
- isSupported: createConstantBridge2("loadAppsInTossAdMob_isSupported")
585
+ loadAppsInTossAdMob: Object.assign(createEventBridge2("loadAppsInTossAdMob"), {
586
+ isSupported: createConstantBridge3("loadAppsInTossAdMob_isSupported")
440
587
  }),
441
588
  /**
442
589
  * @public
@@ -513,19 +660,19 @@ var GoogleAdMob = {
513
660
  * }
514
661
  * ```
515
662
  */
516
- showAppsInTossAdMob: Object.assign(createEventBridge("showAppsInTossAdMob"), {
517
- isSupported: createConstantBridge2("showAppsInTossAdMob_isSupported")
663
+ showAppsInTossAdMob: Object.assign(createEventBridge2("showAppsInTossAdMob"), {
664
+ isSupported: createConstantBridge3("showAppsInTossAdMob_isSupported")
518
665
  })
519
666
  };
520
667
 
521
668
  // src/graniteEvent.ts
522
- import { createEventBridge as createEventBridge2 } from "@apps-in-toss/bridge-core";
669
+ import { createEventBridge as createEventBridge3 } from "@apps-in-toss/bridge-core";
523
670
  var graniteEvent = {
524
671
  addEventListener: (event, {
525
672
  onEvent,
526
673
  onError,
527
674
  options
528
- }) => createEventBridge2(event)({
675
+ }) => createEventBridge3(event)({
529
676
  onEvent,
530
677
  onError: onError ?? (() => {
531
678
  }),
@@ -533,105 +680,14 @@ var graniteEvent = {
533
680
  })
534
681
  };
535
682
 
536
- // src/isMinVersionSupported.ts
537
- import { createConstantBridge as createConstantBridge3 } from "@apps-in-toss/bridge-core";
538
-
539
- // src/utils/compareVersion.ts
540
- var SEMVER_REGEX = /^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\\-]+(?:\.[\da-z\\-]+)*))?(?:\+[\da-z\\-]+(?:\.[\da-z\\-]+)*)?)?)?$/i;
541
- var isWildcard = (val) => ["*", "x", "X"].includes(val);
542
- var tryParse = (val) => {
543
- const num = parseInt(val, 10);
544
- return isNaN(num) ? val : num;
545
- };
546
- var coerceTypes = (a, b) => {
547
- return typeof a === typeof b ? [a, b] : [String(a), String(b)];
548
- };
549
- var compareValues = (a, b) => {
550
- if (isWildcard(a) || isWildcard(b)) {
551
- return 0;
552
- }
553
- const [aVal, bVal] = coerceTypes(tryParse(a), tryParse(b));
554
- if (aVal > bVal) {
555
- return 1;
556
- }
557
- if (aVal < bVal) {
558
- return -1;
559
- }
560
- return 0;
561
- };
562
- var parseVersion = (version) => {
563
- if (typeof version !== "string") {
564
- throw new TypeError("Invalid argument: expected a string");
565
- }
566
- const match = version.match(SEMVER_REGEX);
567
- if (!match) {
568
- throw new Error(`Invalid semver: '${version}'`);
569
- }
570
- const [, major, minor, patch, build, preRelease] = match;
571
- return [major, minor, patch, build, preRelease];
572
- };
573
- var compareSegments = (a, b) => {
574
- const maxLength = Math.max(a.length, b.length);
575
- for (let i = 0; i < maxLength; i++) {
576
- const segA = a[i] ?? "0";
577
- const segB = b[i] ?? "0";
578
- const result = compareValues(segA, segB);
579
- if (result !== 0) {
580
- return result;
581
- }
582
- }
583
- return 0;
584
- };
585
- var compareVersions = (v1, v2) => {
586
- const seg1 = parseVersion(v1);
587
- const seg2 = parseVersion(v2);
588
- const preRelease1 = seg1.pop();
589
- const preRelease2 = seg2.pop();
590
- const mainCompare = compareSegments(seg1, seg2);
591
- if (mainCompare !== 0) {
592
- return mainCompare;
593
- }
594
- if (preRelease1 && preRelease2) {
595
- return compareSegments(preRelease1.split("."), preRelease2.split("."));
596
- }
597
- if (preRelease1) {
598
- return -1;
599
- }
600
- if (preRelease2) {
601
- return 1;
602
- }
603
- return 0;
604
- };
605
-
606
- // src/isMinVersionSupported.ts
607
- function isMinVersionSupported(minVersions) {
608
- const operationalEnvironment = createConstantBridge3("getOperationalEnvironment")();
609
- if (operationalEnvironment === "sandbox") {
610
- return true;
611
- }
612
- const currentVersion = createConstantBridge3("getTossAppVersion")();
613
- const isIOS = createConstantBridge3("getPlatformOS")() === "ios";
614
- const minVersion = isIOS ? minVersions.ios : minVersions.android;
615
- if (minVersion === void 0) {
616
- return false;
617
- }
618
- if (minVersion === "always") {
619
- return true;
620
- }
621
- if (minVersion === "never") {
622
- return false;
623
- }
624
- return compareVersions(currentVersion, minVersion) >= 0;
625
- }
626
-
627
683
  // src/appsInTossEvent.ts
628
- import { createEventBridge as createEventBridge3 } from "@apps-in-toss/bridge-core";
684
+ import { createEventBridge as createEventBridge4 } from "@apps-in-toss/bridge-core";
629
685
  var appsInTossEvent = {
630
686
  addEventListener: (event, {
631
687
  onEvent,
632
688
  onError,
633
689
  options
634
- }) => createEventBridge3(event)({
690
+ }) => createEventBridge4(event)({
635
691
  onEvent,
636
692
  onError: onError ?? (() => {
637
693
  }),
@@ -663,7 +719,7 @@ var getAppsInTossGlobals = () => {
663
719
  };
664
720
 
665
721
  // src/tdsEvent.ts
666
- import { createEventBridge as createEventBridge4 } from "@apps-in-toss/bridge-core";
722
+ import { createEventBridge as createEventBridge5 } from "@apps-in-toss/bridge-core";
667
723
  var tdsEvent = {
668
724
  /**
669
725
  * @public
@@ -693,7 +749,7 @@ var tdsEvent = {
693
749
  onEvent,
694
750
  onError,
695
751
  options
696
- }) => createEventBridge4(event)({
752
+ }) => createEventBridge5(event)({
697
753
  onEvent,
698
754
  onError: onError ?? (() => {
699
755
  }),
@@ -858,14 +914,14 @@ var getClipboardText = createPermissionFunction({
858
914
  });
859
915
 
860
916
  // src/permissions/startUpdateLocation.ts
861
- import { createAsyncBridge as createAsyncBridge11, createEventBridge as createEventBridge5 } from "@apps-in-toss/bridge-core";
917
+ import { createAsyncBridge as createAsyncBridge11, createEventBridge as createEventBridge6 } from "@apps-in-toss/bridge-core";
862
918
  import {
863
919
  StartUpdateLocationPermissionError
864
920
  } from "@apps-in-toss/types";
865
921
  var getPermission2 = createAsyncBridge11("getPermission");
866
922
  var openPermissionDialog2 = createAsyncBridge11("openPermissionDialog");
867
923
  var startUpdateLocation = (params) => {
868
- return createEventBridge5("updateLocationEvent")({
924
+ return createEventBridge6("updateLocationEvent")({
869
925
  ...params,
870
926
  onError: (error) => {
871
927
  const locationError = new StartUpdateLocationPermissionError();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@apps-in-toss/web-bridge",
3
3
  "type": "module",
4
- "version": "1.1.2",
4
+ "version": "1.1.3",
5
5
  "description": "Web Bridge for Apps In Toss",
6
6
  "scripts": {
7
7
  "prepack": "yarn build",
@@ -28,11 +28,11 @@
28
28
  "built"
29
29
  ],
30
30
  "dependencies": {
31
- "@apps-in-toss/types": "1.1.2"
31
+ "@apps-in-toss/types": "1.1.3"
32
32
  },
33
33
  "devDependencies": {
34
- "@apps-in-toss/bridge-core": "1.1.2",
35
- "@apps-in-toss/framework": "1.1.2",
34
+ "@apps-in-toss/bridge-core": "1.1.3",
35
+ "@apps-in-toss/framework": "1.1.3",
36
36
  "@swc/core": "^1.12.7",
37
37
  "picocolors": "^1.1.1",
38
38
  "ts-morph": "^26.0.0",
@@ -46,5 +46,5 @@
46
46
  "publishConfig": {
47
47
  "access": "public"
48
48
  },
49
- "gitHead": "7b3c5e53a3ed0ffef8af2690a5ab92e8dfb0213b"
49
+ "gitHead": "0c80b4a0b49ec85f9f042909c7e9762c25425573"
50
50
  }