@ait-co/devtools 0.1.138 → 0.1.139

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.
@@ -26855,6 +26855,19 @@ withPermission(_fetchContacts, "contacts");
26855
26855
  //#endregion
26856
26856
  //#region src/mock/device/haptic.ts
26857
26857
  /**
26858
+ * Haptic Feedback & saveBase64Data mock
26859
+ *
26860
+ * generateHapticFeedback — 영역 3 (하드웨어 API 관측):
26861
+ * - 10종 HapticFeedbackType을 navigator.vibrate 패턴으로 매핑(근사, best-effort).
26862
+ * - `typeof navigator.vibrate === 'function'` 가드 — API 없는 환경에서 throw 없이 skip.
26863
+ * - @ait-co/polyfill 동시 사용 시 재귀 방지: polyfill이 navigator.vibrate를 override하고
26864
+ * 내부에서 mock의 generateHapticFeedback을 호출하므로 무한 재귀가 발생한다. polyfill이
26865
+ * 원본 vibrate를 BACKUP_KEY(Symbol.for('@ait-co/polyfill/vibrate.original'))에 저장하면
26866
+ * 그 원본을 직접 호출해 재귀를 끊는다.
26867
+ * - sdkCallLog에 🟡(partial)로 기록. params: { hapticType, vibrated: boolean }.
26868
+ * - 시그니처 불변 — __typecheck.ts의 Assert<Mock, Original> 통과.
26869
+ */
26870
+ /**
26858
26871
  * HapticFeedbackType 10종 → navigator.vibrate 패턴 매핑.
26859
26872
  * 숫자: 진동 ms. 배열: [진동, 정지, 진동, …] 교대 패턴.
26860
26873
  */
@@ -26909,11 +26922,7 @@ function callVibrate(pattern) {
26909
26922
  return typeof navigator.vibrate === "function" ? navigator.vibrate(pattern) : false;
26910
26923
  }
26911
26924
  async function generateHapticFeedback(options) {
26912
- if (!Object.hasOwn(HAPTIC_VIBRATE_PATTERN, options.type)) {
26913
- const err = /* @__PURE__ */ new Error(`[@ait-co/devtools] generateHapticFeedback: unknown haptic type "${options.type}"`);
26914
- err.errorCode = "EXECUTION_ERROR";
26915
- throw err;
26916
- }
26925
+ if (!Object.hasOwn(HAPTIC_VIBRATE_PATTERN, options.type)) throw buildNativeError("EXECUTION_ERROR");
26917
26926
  const timestamp = Date.now();
26918
26927
  aitState.logAnalytics({
26919
26928
  type: "haptic",
@@ -27485,11 +27494,7 @@ const GoogleAdMob = createMockProxy("GoogleAdMob", {
27485
27494
  return () => {};
27486
27495
  })),
27487
27496
  isAppsInTossAdMobLoaded: withIsSupported(observe("GoogleAdMob.isAppsInTossAdMobLoaded", "faithful", async (_options) => {
27488
- if (_options?.adGroupId !== void 0 && _options.adGroupId.trim() === "") {
27489
- const err = /* @__PURE__ */ new Error(`[@ait-co/devtools] GoogleAdMob.isAppsInTossAdMobLoaded: malformed adGroupId "${_options.adGroupId}"`);
27490
- err.errorCode = "INVALID_REQUEST";
27491
- throw err;
27492
- }
27497
+ if (_options?.adGroupId !== void 0 && _options.adGroupId.trim() === "") throw buildNativeError("INVALID_REQUEST");
27493
27498
  return aitState.state.ads.isLoaded;
27494
27499
  }))
27495
27500
  });
@@ -27947,6 +27952,7 @@ const IAP = createMockProxy("IAP", {
27947
27952
  return true;
27948
27953
  },
27949
27954
  async getSubscriptionInfo(_args) {
27955
+ if (aitState.state.failureModes.softResolve?.getSubscriptionInfo) return {};
27950
27956
  return { subscription: {
27951
27957
  catalogId: 1,
27952
27958
  status: "ACTIVE",
@@ -30301,7 +30307,7 @@ function Panel() {
30301
30307
  color: "#666",
30302
30308
  fontWeight: 400
30303
30309
  },
30304
- children: ["v", "0.1.138"]
30310
+ children: ["v", "0.1.139"]
30305
30311
  }),
30306
30312
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
30307
30313
  type: "button",