@ait-co/devtools 0.1.136 → 0.1.138
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/{attach-orchestrator-Cjdhir2U.js → attach-orchestrator-6kz_ZdWL.js} +5 -3
- package/dist/{attach-orchestrator-Cjdhir2U.js.map → attach-orchestrator-6kz_ZdWL.js.map} +1 -1
- package/dist/{attach-orchestrator-CE0S09YU.js → attach-orchestrator-BEiz3wAx.js} +5 -3
- package/dist/{attach-orchestrator-CMoDuG2A.js.map → attach-orchestrator-BEiz3wAx.js.map} +1 -1
- package/dist/{attach-orchestrator-CMoDuG2A.js → attach-orchestrator-BG8TGJOZ.js} +5 -3
- package/dist/{attach-orchestrator-CE0S09YU.js.map → attach-orchestrator-BG8TGJOZ.js.map} +1 -1
- package/dist/{bundle-BKqyhEK9.d.ts → bundle-C796JIwG.d.ts} +65 -2
- package/dist/bundle-C796JIwG.d.ts.map +1 -0
- package/dist/{capture-ltuV0gZa.d.ts → capture-DsP525OZ.d.ts} +1 -1
- package/dist/{capture-ltuV0gZa.d.ts.map → capture-DsP525OZ.d.ts.map} +1 -1
- package/dist/{cdp-connection-BYE9meXe.d.ts → cdp-connection-rP1WdnH5.d.ts} +1 -1
- package/dist/{cdp-connection-BYE9meXe.d.ts.map → cdp-connection-rP1WdnH5.d.ts.map} +1 -1
- package/dist/{cell-D1y4shoV.js → cell-BMlFh08P.js} +2 -2
- package/dist/cell-BMlFh08P.js.map +1 -0
- package/dist/{cell-DHA578lX.js → cell-Dtgtusog.js} +90 -16
- package/dist/cell-Dtgtusog.js.map +1 -0
- package/dist/{cell-BIdSQb9T.js → cell-KsRXFdDs.js} +122 -16
- package/dist/cell-KsRXFdDs.js.map +1 -0
- package/dist/{debug-server-BZtH2Z5b.js → debug-server-6c22qSWa.js} +150 -9
- package/dist/debug-server-6c22qSWa.js.map +1 -0
- package/dist/{debug-server-DApo0o3t.js → debug-server-BQHbaKPT.js} +152 -11
- package/dist/debug-server-BQHbaKPT.js.map +1 -0
- package/dist/{debug-server-D2wpPK3_.js → debug-server-DWat7d-9.js} +82 -6
- package/dist/debug-server-DWat7d-9.js.map +1 -0
- package/dist/devtools-opener-3Drge_RJ.js +75 -0
- package/dist/devtools-opener-3Drge_RJ.js.map +1 -0
- package/dist/devtools-opener-CJpEsXXQ.js +76 -0
- package/dist/devtools-opener-CJpEsXXQ.js.map +1 -0
- package/dist/devtools-opener-CxtryS8c.js +75 -0
- package/dist/devtools-opener-CxtryS8c.js.map +1 -0
- package/dist/in-app/auto.js +59 -12
- package/dist/in-app/auto.js.map +1 -1
- package/dist/in-app/index.d.ts +21 -2
- package/dist/in-app/index.d.ts.map +1 -1
- package/dist/in-app/index.js +60 -13
- package/dist/in-app/index.js.map +1 -1
- package/dist/mcp/cli.js +363 -73
- package/dist/mcp/cli.js.map +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/mock/index.d.ts +64 -1
- package/dist/mock/index.d.ts.map +1 -1
- package/dist/mock/index.js +221 -14
- package/dist/mock/index.js.map +1 -1
- package/dist/panel/index.js +178 -23
- package/dist/panel/index.js.map +1 -1
- package/dist/{pool-C6TgrcyW.d.ts → pool-CrP5CPvU.d.ts} +3 -3
- package/dist/{pool-C6TgrcyW.d.ts.map → pool-CrP5CPvU.d.ts.map} +1 -1
- package/dist/{qr-http-server-ZkT6F7is.js → qr-http-server-D1hpoyBF.js} +1 -1
- package/dist/{qr-http-server-ZkT6F7is.js.map → qr-http-server-D1hpoyBF.js.map} +1 -1
- package/dist/qr-http-server-D4rGz8M7.js +1640 -0
- package/dist/qr-http-server-D4rGz8M7.js.map +1 -0
- package/dist/{qr-http-server-C7q8Gn04.js → qr-http-server-DIjCV7h_.js} +1 -1
- package/dist/{qr-http-server-C7q8Gn04.js.map → qr-http-server-DIjCV7h_.js.map} +1 -1
- package/dist/{relay-factory-DnuTH4v-.js → relay-factory-C1X3G3WY.js} +72 -15
- package/dist/relay-factory-C1X3G3WY.js.map +1 -0
- package/dist/{relay-secret-store-CLEGyHou.js → relay-secret-store-Bmyleu0A.js} +1 -1
- package/dist/{relay-secret-store-CLEGyHou.js.map → relay-secret-store-Bmyleu0A.js.map} +1 -1
- package/dist/{relay-secret-store-DhzAnnj-.js → relay-secret-store-CQenfcSL.js} +2 -2
- package/dist/{relay-secret-store-DhzAnnj-.js.map → relay-secret-store-CQenfcSL.js.map} +1 -1
- package/dist/{relay-secret-store-BcVrWwTq.js → relay-secret-store-DKxs7zwq.js} +1 -1
- package/dist/{relay-secret-store-DGduVJhs.js.map → relay-secret-store-DKxs7zwq.js.map} +1 -1
- package/dist/{relay-secret-store-DGduVJhs.js → relay-secret-store-WJ8EGkIl.js} +1 -1
- package/dist/{relay-secret-store-BcVrWwTq.js.map → relay-secret-store-WJ8EGkIl.js.map} +1 -1
- package/dist/{relay-url-store-CKW8RQzf.js → relay-url-store-BR2XodiO.js} +2 -2
- package/dist/{relay-url-store-CKW8RQzf.js.map → relay-url-store-BR2XodiO.js.map} +1 -1
- package/dist/{relay-url-store-CdA58fgw.js → relay-url-store-CH63fVCm.js} +2 -2
- package/dist/{relay-url-store-B0X8TsGr.js.map → relay-url-store-CH63fVCm.js.map} +1 -1
- package/dist/{relay-url-store-CwKT7i04.js → relay-url-store-DaY1QPes.js} +2 -2
- package/dist/{relay-url-store-CwKT7i04.js.map → relay-url-store-DaY1QPes.js.map} +1 -1
- package/dist/{relay-url-store-B0X8TsGr.js → relay-url-store-xmUuTjXA.js} +2 -2
- package/dist/{relay-url-store-CdA58fgw.js.map → relay-url-store-xmUuTjXA.js.map} +1 -1
- package/dist/{relay-worker-UK0nBfDX.js → relay-worker-BUXI0K0b.js} +13 -6
- package/dist/{relay-worker-UK0nBfDX.js.map → relay-worker-BUXI0K0b.js.map} +1 -1
- package/dist/{relay-worker-Dw3aIzIK.d.ts → relay-worker-DcyboK43.d.ts} +70 -11
- package/dist/relay-worker-DcyboK43.d.ts.map +1 -0
- package/dist/{runtime-DfHHZms2.d.ts → runtime-BiigOuvb.d.ts} +30 -3
- package/dist/runtime-BiigOuvb.d.ts.map +1 -0
- package/dist/test-runner/bin.js +481 -62
- package/dist/test-runner/bin.js.map +1 -1
- package/dist/test-runner/bridge-stub.d.ts +125 -0
- package/dist/test-runner/bridge-stub.d.ts.map +1 -0
- package/dist/test-runner/bridge-stub.js +92 -0
- package/dist/test-runner/bridge-stub.js.map +1 -0
- package/dist/test-runner/bundle.d.ts +2 -2
- package/dist/test-runner/bundle.js +107 -24
- package/dist/test-runner/bundle.js.map +1 -1
- package/dist/test-runner/capture.d.ts +1 -1
- package/dist/test-runner/config.d.ts +68 -5
- package/dist/test-runner/config.d.ts.map +1 -1
- package/dist/test-runner/config.js +1 -1
- package/dist/test-runner/method-pace.d.ts +82 -0
- package/dist/test-runner/method-pace.d.ts.map +1 -0
- package/dist/test-runner/method-pace.js +120 -0
- package/dist/test-runner/method-pace.js.map +1 -0
- package/dist/test-runner/pool.d.ts +1 -1
- package/dist/test-runner/pool.js +1 -1
- package/dist/test-runner/relay-factory.d.ts +67 -4
- package/dist/test-runner/relay-factory.d.ts.map +1 -1
- package/dist/test-runner/relay-factory.js +71 -14
- package/dist/test-runner/relay-factory.js.map +1 -1
- package/dist/test-runner/relay-worker.d.ts +1 -1
- package/dist/test-runner/relay-worker.js +1 -1
- package/dist/test-runner/report.d.ts +43 -17
- package/dist/test-runner/report.d.ts.map +1 -1
- package/dist/test-runner/report.js +33 -9
- package/dist/test-runner/report.js.map +1 -1
- package/dist/test-runner/rpc.d.ts +2 -2
- package/dist/test-runner/runtime.d.ts +2 -2
- package/dist/test-runner/runtime.js +83 -6
- package/dist/test-runner/runtime.js.map +1 -1
- package/dist/test-runner/task-graph.d.ts +1 -1
- package/dist/throttle-DKKzX1qC.js +59 -0
- package/dist/throttle-DKKzX1qC.js.map +1 -0
- package/dist/totp-Dwft0Kz7.js +3 -0
- package/package.json +1 -1
- package/dist/bundle-BKqyhEK9.d.ts.map +0 -1
- package/dist/cell-BIdSQb9T.js.map +0 -1
- package/dist/cell-D1y4shoV.js.map +0 -1
- package/dist/cell-DHA578lX.js.map +0 -1
- package/dist/debug-server-BZtH2Z5b.js.map +0 -1
- package/dist/debug-server-D2wpPK3_.js.map +0 -1
- package/dist/debug-server-DApo0o3t.js.map +0 -1
- package/dist/relay-factory-DnuTH4v-.js.map +0 -1
- package/dist/relay-worker-Dw3aIzIK.d.ts.map +0 -1
- package/dist/runtime-DfHHZms2.d.ts.map +0 -1
- package/dist/totp-D1pulXLa.js +0 -3
package/dist/panel/index.js
CHANGED
|
@@ -25897,7 +25897,8 @@ const DEFAULT_STATE = {
|
|
|
25897
25897
|
frame: false,
|
|
25898
25898
|
aitNavBar: true,
|
|
25899
25899
|
aitNavBarType: "partner"
|
|
25900
|
-
}
|
|
25900
|
+
},
|
|
25901
|
+
failureModes: { sdkLine: "2.x" }
|
|
25901
25902
|
};
|
|
25902
25903
|
function generateDeviceId() {
|
|
25903
25904
|
const stored = localStorage.getItem("__ait_device_id");
|
|
@@ -26409,6 +26410,104 @@ function waitForPromptResponse(type) {
|
|
|
26409
26410
|
});
|
|
26410
26411
|
}
|
|
26411
26412
|
//#endregion
|
|
26413
|
+
//#region src/mock/native-error.ts
|
|
26414
|
+
/**
|
|
26415
|
+
* 실패-모드 다이얼 — 네이티브 에러 envelope 조립 (devtools#770).
|
|
26416
|
+
*
|
|
26417
|
+
* env1(mock)이 env3(실기기)의 프로비저닝-의존 reject 계약을 재현할 수 있게 하는
|
|
26418
|
+
* 공용 헬퍼. `aitState.failureModes`(state.ts)에 per-API 코드를 설정하면, 각
|
|
26419
|
+
* mock 도메인(auth/ads 등)이 이 모듈의 {@link buildNativeError}로 실기기 캡처와
|
|
26420
|
+
* 필드 단위로 일치하는 에러 객체를 만들어 reject/onError한다.
|
|
26421
|
+
*
|
|
26422
|
+
* 코드 인벤토리와 envelope shape의 정본은 sdk-example#284 2.x↔3.0 diff
|
|
26423
|
+
* 매트릭스(2026-07-10 iOS run10 캡처 + 이후 manual 패스)다:
|
|
26424
|
+
*
|
|
26425
|
+
* - 2.x 라인: 네이티브 브리지가 `{ name, code, userInfo, moduleName, __isError }`
|
|
26426
|
+
* envelope을 얹은 `Error` 인스턴스로 reject한다. `errorKeys` 관측이 이 5개
|
|
26427
|
+
* 필드로 고정.
|
|
26428
|
+
* - 3.x 라인: 같은 실패가 "맨 Error"(위 envelope 필드 없음)로 평탄화된다 —
|
|
26429
|
+
* sdk-example#284 "패턴 ① 오류 envelope 평탄화" 표.
|
|
26430
|
+
*
|
|
26431
|
+
* `src/test-runner/bridge-stub.ts`의 `NativeBridgeErrorShape`/`makeNativeError`가
|
|
26432
|
+
* 같은 shape을 이미 CI 러너 쪽에서 재현하고 있다(devtools#740) — 이 모듈은 그
|
|
26433
|
+
* shape을 mock 소비자 표면(`src/mock/**`)에 대해 재사용 가능한 형태로 옮긴 것이다.
|
|
26434
|
+
* 두 모듈은 레이어가 다르다: test-runner 쪽은 env3 blocking-call 인터셉터(빌드에
|
|
26435
|
+
* 안 실림, CI 전용), 이쪽은 `@ait-co/devtools` 소비자가 `pnpm dev`에서 실제로
|
|
26436
|
+
* import하는 mock 런타임이다 — 서로 import하지 않는다(devtools#740이 test-runner
|
|
26437
|
+
* 전용 모듈임을 명시).
|
|
26438
|
+
*/
|
|
26439
|
+
/** 코드별 기본 message/moduleName — 실기기 캡처 관측값. */
|
|
26440
|
+
const CODE_META = {
|
|
26441
|
+
APP_LOGIN: {
|
|
26442
|
+
message: "Login failed",
|
|
26443
|
+
moduleName: "RNTossLogin"
|
|
26444
|
+
},
|
|
26445
|
+
PLACEMENT_ID_FETCH_FAILED: {
|
|
26446
|
+
message: "Failed to fetch placement id",
|
|
26447
|
+
moduleName: "RNAdMob"
|
|
26448
|
+
},
|
|
26449
|
+
EXECUTION_ERROR: {
|
|
26450
|
+
message: "Execution error",
|
|
26451
|
+
moduleName: "RNFullScreenAd"
|
|
26452
|
+
},
|
|
26453
|
+
NO_PERMISSION: {
|
|
26454
|
+
message: "No permission",
|
|
26455
|
+
moduleName: "RNPermissions"
|
|
26456
|
+
},
|
|
26457
|
+
INVALID_REQUEST: {
|
|
26458
|
+
message: "Invalid request",
|
|
26459
|
+
moduleName: "RNPermissions"
|
|
26460
|
+
},
|
|
26461
|
+
INVALID_DATA: {
|
|
26462
|
+
message: "Invalid data",
|
|
26463
|
+
moduleName: "RNFileSystem"
|
|
26464
|
+
},
|
|
26465
|
+
FAILED_TO_GET_LOADED_AD: {
|
|
26466
|
+
message: "Failed to get loaded ad",
|
|
26467
|
+
moduleName: "RNAdMob"
|
|
26468
|
+
},
|
|
26469
|
+
APP_BRIDGE_THROTTLED: {
|
|
26470
|
+
message: "Too many app bridge calls from this method.",
|
|
26471
|
+
moduleName: "RNBridge"
|
|
26472
|
+
},
|
|
26473
|
+
"1006": {
|
|
26474
|
+
message: "광고가 로드 중이거나 준비되지 않았습니다",
|
|
26475
|
+
moduleName: "RNFullScreenAd"
|
|
26476
|
+
},
|
|
26477
|
+
"4000": {
|
|
26478
|
+
message: "Notification agreement failed",
|
|
26479
|
+
moduleName: "RNNotification"
|
|
26480
|
+
}
|
|
26481
|
+
};
|
|
26482
|
+
/**
|
|
26483
|
+
* `aitState.failureModes.sdkLine`이 가리키는 라인으로 네이티브 실패를 조립한다.
|
|
26484
|
+
*
|
|
26485
|
+
* - `'2.x'`(기본): {@link NativeErrorEnvelope} 필드가 실린 `Error` — 실기기 2.x
|
|
26486
|
+
* 캡처(`{name, code, userInfo, moduleName, __isError}`)와 필드 단위 일치.
|
|
26487
|
+
* - `'3.x'`: 같은 실패가 "맨 Error"로 평탄화된 것을 재현 — envelope 필드 없이
|
|
26488
|
+
* message만 실린 순수 `Error` 인스턴스.
|
|
26489
|
+
*
|
|
26490
|
+
* 호출부는 두 종류다:
|
|
26491
|
+
*
|
|
26492
|
+
* - **다이얼 게이트 뒤**(대부분): 프로비저닝처럼 환경에 따라 갈리는 실패는
|
|
26493
|
+
* 다이얼이 설정된 경우에만 재현한다 — 미설정 시 기존 동작 무변화
|
|
26494
|
+
* (zero behavior change). 호출 전에 다이얼 값을 명시적으로 확인한다.
|
|
26495
|
+
* - **무조건**(입력 검증): 빈 `data`나 알 수 없는 haptic type처럼 환경과 무관하게
|
|
26496
|
+
* 실기기가 **항상** 거부하는 입력은 다이얼 없이 바로 던진다. 이건 "가끔 일어나는
|
|
26497
|
+
* 실패"의 시뮬레이션이 아니라 결정적 계약이므로 opt-in 대상이 아니다.
|
|
26498
|
+
*/
|
|
26499
|
+
function buildNativeError(code) {
|
|
26500
|
+
const meta = CODE_META[code];
|
|
26501
|
+
if (aitState.state.failureModes.sdkLine === "3.x") return new Error(meta.message);
|
|
26502
|
+
const err = new Error(meta.message);
|
|
26503
|
+
err.name = "Error";
|
|
26504
|
+
err.code = code;
|
|
26505
|
+
err.userInfo = {};
|
|
26506
|
+
err.moduleName = meta.moduleName;
|
|
26507
|
+
err.__isError = true;
|
|
26508
|
+
return err;
|
|
26509
|
+
}
|
|
26510
|
+
//#endregion
|
|
26412
26511
|
//#region src/mock/permissions.ts
|
|
26413
26512
|
/**
|
|
26414
26513
|
* web-framework 3.0+ 권한 에러 기반 클래스.
|
|
@@ -26466,9 +26565,42 @@ const permissionErrorMap = {
|
|
|
26466
26565
|
setClipboardText: SetClipboardTextPermissionError
|
|
26467
26566
|
};
|
|
26468
26567
|
async function getPermission(permission) {
|
|
26568
|
+
const failureCode = permissionGateCode(permission);
|
|
26569
|
+
if (failureCode) throw buildNativeError(failureCode);
|
|
26469
26570
|
return aitState.state.permissions[permission.name];
|
|
26470
26571
|
}
|
|
26572
|
+
/**
|
|
26573
|
+
* 선언 게이트에 걸리는 이름·access 조합이면 다이얼에 등록된 native errorCode를
|
|
26574
|
+
* 돌려준다. 세 권한 API(`getPermission`/`requestPermission`/`openPermissionDialog`)가
|
|
26575
|
+
* **걸리는 조건**은 공유하지만 **떨어지는 코드**는 공유하지 않는다 — 아래 참조.
|
|
26576
|
+
*/
|
|
26577
|
+
function permissionGateCode(permission) {
|
|
26578
|
+
if (permission.access === "access") return;
|
|
26579
|
+
return aitState.state.failureModes.getPermission?.[permission.name];
|
|
26580
|
+
}
|
|
26581
|
+
/**
|
|
26582
|
+
* `openPermissionDialog`가 선언 게이트에 걸렸을 때의 코드.
|
|
26583
|
+
*
|
|
26584
|
+
* 형제 API와 갈린다 — env3 run11 실측(2.x/iOS, sdk-example#313에서 시나리오 키가
|
|
26585
|
+
* 통일되며 비교 대상에 들어온 값):
|
|
26586
|
+
*
|
|
26587
|
+
* getPermission { geolocation, read } → rejected NO_PERMISSION
|
|
26588
|
+
* requestPermission { geolocation, read } → rejected NO_PERMISSION
|
|
26589
|
+
* openPermissionDialog { geolocation, read } → rejected INVALID_REQUEST
|
|
26590
|
+
* openPermissionDialog { camera, access } → resolved
|
|
26591
|
+
*
|
|
26592
|
+
* 즉 **걸리는 조건은 셋이 같고(access 축 모델 그대로) 코드만 갈린다.** 처음엔
|
|
26593
|
+
* `requestPermission`이 `openPermissionDialog`에 위임하니 게이트도 위임하면
|
|
26594
|
+
* 된다고 보고 한 지점에만 배선했는데, 그 모델은 코드 층위에서 실측과 어긋났다
|
|
26595
|
+
* (env1 NO_PERMISSION ↔ env3 INVALID_REQUEST). 그래서 `requestPermission`은
|
|
26596
|
+
* 위임 **전에** 자기 게이트를 먼저 타고, 다이얼로그를 여는 호출만 이 코드를 쓴다.
|
|
26597
|
+
*
|
|
26598
|
+
* 관측이 geolocation/read 한 조합뿐이라 이름·access별 분기는 두지 않는다 —
|
|
26599
|
+
* 근거 없는 확장은 #783에서 이름 단위 맵을 택한 원칙에 어긋난다.
|
|
26600
|
+
*/
|
|
26601
|
+
const OPEN_DIALOG_GATE_CODE = "INVALID_REQUEST";
|
|
26471
26602
|
async function openPermissionDialog(permission) {
|
|
26603
|
+
if (permissionGateCode(permission)) throw buildNativeError(OPEN_DIALOG_GATE_CODE);
|
|
26472
26604
|
if (aitState.state.permissions[permission.name] === "allowed") return "allowed";
|
|
26473
26605
|
aitState.patch("permissions", { [permission.name]: "allowed" });
|
|
26474
26606
|
return "allowed";
|
|
@@ -26693,9 +26825,10 @@ const _setClipboardText = async (text) => {
|
|
|
26693
26825
|
checkPermission("clipboard", "setClipboardText");
|
|
26694
26826
|
if (aitState.state.deviceModes.clipboard === "mock") {
|
|
26695
26827
|
aitState.patch("mockData", { clipboardText: text });
|
|
26696
|
-
return;
|
|
26828
|
+
return { text };
|
|
26697
26829
|
}
|
|
26698
26830
|
await navigator.clipboard.writeText(text);
|
|
26831
|
+
return { text };
|
|
26699
26832
|
};
|
|
26700
26833
|
withPermission(_setClipboardText, "clipboard");
|
|
26701
26834
|
//#endregion
|
|
@@ -26722,19 +26855,6 @@ withPermission(_fetchContacts, "contacts");
|
|
|
26722
26855
|
//#endregion
|
|
26723
26856
|
//#region src/mock/device/haptic.ts
|
|
26724
26857
|
/**
|
|
26725
|
-
* Haptic Feedback & saveBase64Data mock
|
|
26726
|
-
*
|
|
26727
|
-
* generateHapticFeedback — 영역 3 (하드웨어 API 관측):
|
|
26728
|
-
* - 10종 HapticFeedbackType을 navigator.vibrate 패턴으로 매핑(근사, best-effort).
|
|
26729
|
-
* - `typeof navigator.vibrate === 'function'` 가드 — API 없는 환경에서 throw 없이 skip.
|
|
26730
|
-
* - @ait-co/polyfill 동시 사용 시 재귀 방지: polyfill이 navigator.vibrate를 override하고
|
|
26731
|
-
* 내부에서 mock의 generateHapticFeedback을 호출하므로 무한 재귀가 발생한다. polyfill이
|
|
26732
|
-
* 원본 vibrate를 BACKUP_KEY(Symbol.for('@ait-co/polyfill/vibrate.original'))에 저장하면
|
|
26733
|
-
* 그 원본을 직접 호출해 재귀를 끊는다.
|
|
26734
|
-
* - sdkCallLog에 🟡(partial)로 기록. params: { hapticType, vibrated: boolean }.
|
|
26735
|
-
* - 시그니처 불변 — __typecheck.ts의 Assert<Mock, Original> 통과.
|
|
26736
|
-
*/
|
|
26737
|
-
/**
|
|
26738
26858
|
* HapticFeedbackType 10종 → navigator.vibrate 패턴 매핑.
|
|
26739
26859
|
* 숫자: 진동 ms. 배열: [진동, 정지, 진동, …] 교대 패턴.
|
|
26740
26860
|
*/
|
|
@@ -26789,6 +26909,11 @@ function callVibrate(pattern) {
|
|
|
26789
26909
|
return typeof navigator.vibrate === "function" ? navigator.vibrate(pattern) : false;
|
|
26790
26910
|
}
|
|
26791
26911
|
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
|
+
}
|
|
26792
26917
|
const timestamp = Date.now();
|
|
26793
26918
|
aitState.logAnalytics({
|
|
26794
26919
|
type: "haptic",
|
|
@@ -26821,7 +26946,11 @@ function buildLocation() {
|
|
|
26821
26946
|
};
|
|
26822
26947
|
}
|
|
26823
26948
|
async function getCurrentLocationMock() {
|
|
26824
|
-
|
|
26949
|
+
const { coords, timestamp } = buildLocation();
|
|
26950
|
+
return {
|
|
26951
|
+
coords,
|
|
26952
|
+
timestamp
|
|
26953
|
+
};
|
|
26825
26954
|
}
|
|
26826
26955
|
async function getCurrentLocationWeb() {
|
|
26827
26956
|
return new Promise((resolve) => {
|
|
@@ -26840,8 +26969,7 @@ async function getCurrentLocationWeb() {
|
|
|
26840
26969
|
altitudeAccuracy: pos.coords.altitudeAccuracy ?? 0,
|
|
26841
26970
|
heading: pos.coords.heading ?? 0
|
|
26842
26971
|
},
|
|
26843
|
-
timestamp: pos.timestamp
|
|
26844
|
-
accessLocation: "FINE"
|
|
26972
|
+
timestamp: pos.timestamp
|
|
26845
26973
|
});
|
|
26846
26974
|
}, () => {
|
|
26847
26975
|
console.warn("[@ait-co/devtools] Geolocation failed, falling back to mock");
|
|
@@ -26850,7 +26978,11 @@ async function getCurrentLocationWeb() {
|
|
|
26850
26978
|
});
|
|
26851
26979
|
}
|
|
26852
26980
|
async function getCurrentLocationPrompt() {
|
|
26853
|
-
|
|
26981
|
+
const { coords, timestamp } = await waitForPromptResponse("location");
|
|
26982
|
+
return {
|
|
26983
|
+
coords,
|
|
26984
|
+
timestamp
|
|
26985
|
+
};
|
|
26854
26986
|
}
|
|
26855
26987
|
const _getCurrentLocation = async (_options) => {
|
|
26856
26988
|
checkPermission("geolocation", "getCurrentLocation");
|
|
@@ -26968,13 +27100,16 @@ createMockProxy("Storage", {
|
|
|
26968
27100
|
},
|
|
26969
27101
|
setItem: async (key, value) => {
|
|
26970
27102
|
localStorage.setItem(`__ait_storage:${key}`, value);
|
|
27103
|
+
return null;
|
|
26971
27104
|
},
|
|
26972
27105
|
removeItem: async (key) => {
|
|
26973
27106
|
localStorage.removeItem(`__ait_storage:${key}`);
|
|
27107
|
+
return null;
|
|
26974
27108
|
},
|
|
26975
27109
|
clearItems: async () => {
|
|
26976
27110
|
const keys = Object.keys(localStorage).filter((k) => k.startsWith("__ait_storage:"));
|
|
26977
27111
|
for (const k of keys) localStorage.removeItem(k);
|
|
27112
|
+
return null;
|
|
26978
27113
|
}
|
|
26979
27114
|
});
|
|
26980
27115
|
//#endregion
|
|
@@ -27313,6 +27448,11 @@ function _nextSlotId(adGroupId) {
|
|
|
27313
27448
|
const GoogleAdMob = createMockProxy("GoogleAdMob", {
|
|
27314
27449
|
loadAppsInTossAdMob: withIsSupported(observe("GoogleAdMob.loadAppsInTossAdMob", "faithful", (args) => {
|
|
27315
27450
|
setTimeout(() => {
|
|
27451
|
+
const failureCode = aitState.state.failureModes.loadAdMob;
|
|
27452
|
+
if (failureCode) {
|
|
27453
|
+
args.onError(buildNativeError(failureCode));
|
|
27454
|
+
return;
|
|
27455
|
+
}
|
|
27316
27456
|
if (aitState.state.ads.forceNoFill) {
|
|
27317
27457
|
args.onError(/* @__PURE__ */ new Error("No fill"));
|
|
27318
27458
|
return;
|
|
@@ -27344,7 +27484,14 @@ const GoogleAdMob = createMockProxy("GoogleAdMob", {
|
|
|
27344
27484
|
}, 1500);
|
|
27345
27485
|
return () => {};
|
|
27346
27486
|
})),
|
|
27347
|
-
isAppsInTossAdMobLoaded: withIsSupported(observe("GoogleAdMob.isAppsInTossAdMobLoaded", "faithful", async (_options) =>
|
|
27487
|
+
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
|
+
}
|
|
27493
|
+
return aitState.state.ads.isLoaded;
|
|
27494
|
+
}))
|
|
27348
27495
|
});
|
|
27349
27496
|
const TossAds = createMockProxy("TossAds", {
|
|
27350
27497
|
initialize: withIsSupported(observe("TossAds.initialize", "partial", (options) => {
|
|
@@ -27433,6 +27580,11 @@ const TossAds = createMockProxy("TossAds", {
|
|
|
27433
27580
|
});
|
|
27434
27581
|
const loadFullScreenAd = withIsSupported(observe("loadFullScreenAd", "faithful", (args) => {
|
|
27435
27582
|
setTimeout(() => {
|
|
27583
|
+
const failureCode = aitState.state.failureModes.loadFullScreenAd;
|
|
27584
|
+
if (failureCode) {
|
|
27585
|
+
args.onError(buildNativeError(failureCode));
|
|
27586
|
+
return;
|
|
27587
|
+
}
|
|
27436
27588
|
if (aitState.state.ads.forceNoFill) {
|
|
27437
27589
|
args.onError(/* @__PURE__ */ new Error("No fill"));
|
|
27438
27590
|
return;
|
|
@@ -27764,12 +27916,15 @@ const IAP = createMockProxy("IAP", {
|
|
|
27764
27916
|
})) };
|
|
27765
27917
|
},
|
|
27766
27918
|
async getPendingOrders() {
|
|
27767
|
-
|
|
27919
|
+
const orders = [...aitState.state.iap.pendingOrders];
|
|
27920
|
+
return {
|
|
27921
|
+
orders,
|
|
27922
|
+
orderIds: orders.map((o) => o.orderId)
|
|
27923
|
+
};
|
|
27768
27924
|
},
|
|
27769
27925
|
async getCompletedOrRefundedOrders() {
|
|
27770
27926
|
return {
|
|
27771
27927
|
hasNext: false,
|
|
27772
|
-
nextKey: null,
|
|
27773
27928
|
orders: [...aitState.state.iap.completedOrders]
|
|
27774
27929
|
};
|
|
27775
27930
|
},
|
|
@@ -30146,7 +30301,7 @@ function Panel() {
|
|
|
30146
30301
|
color: "#666",
|
|
30147
30302
|
fontWeight: 400
|
|
30148
30303
|
},
|
|
30149
|
-
children: ["v", "0.1.
|
|
30304
|
+
children: ["v", "0.1.138"]
|
|
30150
30305
|
}),
|
|
30151
30306
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
30152
30307
|
type: "button",
|