@ait-co/devtools 0.0.1 → 0.0.2
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/README.md +430 -134
- package/dist/chunk-6PPZTREF.js +569 -0
- package/dist/chunk-6PPZTREF.js.map +1 -0
- package/dist/mock/index.d.ts +22 -6
- package/dist/mock/index.js +87 -272
- package/dist/mock/index.js.map +1 -1
- package/dist/panel/index.d.ts +1 -1
- package/dist/panel/index.js +588 -32
- package/dist/panel/index.js.map +1 -1
- package/dist/unplugin/index.cjs +13 -12
- package/dist/unplugin/index.cjs.map +1 -1
- package/dist/unplugin/index.d.cts +51 -0
- package/dist/unplugin/index.d.ts +51 -0
- package/dist/unplugin/index.js +13 -12
- package/dist/unplugin/index.js.map +1 -1
- package/package.json +19 -10
- package/dist/chunk-YYIIG3JT.js +0 -146
- package/dist/chunk-YYIIG3JT.js.map +0 -1
package/dist/chunk-YYIIG3JT.js
DELETED
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
// src/mock/state.ts
|
|
2
|
-
var DEFAULT_STATE = {
|
|
3
|
-
platform: "ios",
|
|
4
|
-
environment: "sandbox",
|
|
5
|
-
appVersion: "5.240.0",
|
|
6
|
-
locale: "ko-KR",
|
|
7
|
-
schemeUri: "/",
|
|
8
|
-
groupId: "mock-group-id",
|
|
9
|
-
deploymentId: "mock-deployment-id",
|
|
10
|
-
deviceId: "",
|
|
11
|
-
brand: {
|
|
12
|
-
displayName: "Mock App",
|
|
13
|
-
icon: "",
|
|
14
|
-
primaryColor: "#3182F6"
|
|
15
|
-
},
|
|
16
|
-
networkStatus: "WIFI",
|
|
17
|
-
permissions: {
|
|
18
|
-
clipboard: "allowed",
|
|
19
|
-
contacts: "allowed",
|
|
20
|
-
photos: "allowed",
|
|
21
|
-
geolocation: "allowed",
|
|
22
|
-
camera: "allowed",
|
|
23
|
-
microphone: "notDetermined"
|
|
24
|
-
},
|
|
25
|
-
location: {
|
|
26
|
-
coords: {
|
|
27
|
-
latitude: 37.5665,
|
|
28
|
-
longitude: 126.978,
|
|
29
|
-
altitude: 0,
|
|
30
|
-
accuracy: 10,
|
|
31
|
-
altitudeAccuracy: 0,
|
|
32
|
-
heading: 0
|
|
33
|
-
},
|
|
34
|
-
timestamp: Date.now(),
|
|
35
|
-
accessLocation: "FINE"
|
|
36
|
-
},
|
|
37
|
-
safeAreaInsets: { top: 47, bottom: 34, left: 0, right: 0 },
|
|
38
|
-
contacts: [
|
|
39
|
-
{ name: "\uD64D\uAE38\uB3D9", phoneNumber: "010-1234-5678" },
|
|
40
|
-
{ name: "\uAE40\uD1A0\uC2A4", phoneNumber: "010-9876-5432" }
|
|
41
|
-
],
|
|
42
|
-
iap: {
|
|
43
|
-
products: [
|
|
44
|
-
{
|
|
45
|
-
sku: "mock-gem-100",
|
|
46
|
-
type: "CONSUMABLE",
|
|
47
|
-
displayName: "\uBCF4\uC11D 100\uAC1C",
|
|
48
|
-
displayAmount: "1,000\uC6D0",
|
|
49
|
-
iconUrl: "",
|
|
50
|
-
description: "\uAC8C\uC784\uC5D0\uC11C \uC0AC\uC6A9\uD560 \uC218 \uC788\uB294 \uBCF4\uC11D 100\uAC1C"
|
|
51
|
-
}
|
|
52
|
-
],
|
|
53
|
-
nextResult: "success",
|
|
54
|
-
pendingOrders: [],
|
|
55
|
-
completedOrders: []
|
|
56
|
-
},
|
|
57
|
-
payment: {
|
|
58
|
-
nextResult: "success",
|
|
59
|
-
failReason: ""
|
|
60
|
-
},
|
|
61
|
-
auth: {
|
|
62
|
-
isLoggedIn: true,
|
|
63
|
-
isTossLoginIntegrated: true,
|
|
64
|
-
userKeyHash: "mock-user-hash-abc123"
|
|
65
|
-
},
|
|
66
|
-
ads: {
|
|
67
|
-
isLoaded: false,
|
|
68
|
-
nextEvent: "loaded"
|
|
69
|
-
},
|
|
70
|
-
game: {
|
|
71
|
-
profile: { nickname: "MockPlayer", profileImageUri: "" },
|
|
72
|
-
leaderboardScores: []
|
|
73
|
-
},
|
|
74
|
-
analyticsLog: []
|
|
75
|
-
};
|
|
76
|
-
function generateDeviceId() {
|
|
77
|
-
const stored = localStorage.getItem("__ait_device_id");
|
|
78
|
-
if (stored) return stored;
|
|
79
|
-
const id = crypto.randomUUID();
|
|
80
|
-
localStorage.setItem("__ait_device_id", id);
|
|
81
|
-
return id;
|
|
82
|
-
}
|
|
83
|
-
var AitStateManager = class {
|
|
84
|
-
_state;
|
|
85
|
-
_listeners = /* @__PURE__ */ new Set();
|
|
86
|
-
constructor() {
|
|
87
|
-
this._state = structuredClone(DEFAULT_STATE);
|
|
88
|
-
try {
|
|
89
|
-
this._state.deviceId = generateDeviceId();
|
|
90
|
-
} catch {
|
|
91
|
-
this._state.deviceId = "mock-device-" + Math.random().toString(36).slice(2);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
get state() {
|
|
95
|
-
return this._state;
|
|
96
|
-
}
|
|
97
|
-
update(partial) {
|
|
98
|
-
this._state = { ...this._state, ...partial };
|
|
99
|
-
this._notify();
|
|
100
|
-
}
|
|
101
|
-
/** 중첩 객체 업데이트용 */
|
|
102
|
-
patch(key, partial) {
|
|
103
|
-
const current = this._state[key];
|
|
104
|
-
if (typeof current === "object" && current !== null && !Array.isArray(current)) {
|
|
105
|
-
this._state = { ...this._state, [key]: { ...current, ...partial } };
|
|
106
|
-
} else {
|
|
107
|
-
this._state = { ...this._state, [key]: partial };
|
|
108
|
-
}
|
|
109
|
-
this._notify();
|
|
110
|
-
}
|
|
111
|
-
subscribe(listener) {
|
|
112
|
-
this._listeners.add(listener);
|
|
113
|
-
return () => this._listeners.delete(listener);
|
|
114
|
-
}
|
|
115
|
-
/** 분석 로그 추가 */
|
|
116
|
-
logAnalytics(entry) {
|
|
117
|
-
this._state = {
|
|
118
|
-
...this._state,
|
|
119
|
-
analyticsLog: [...this._state.analyticsLog, { ...entry, timestamp: Date.now() }]
|
|
120
|
-
};
|
|
121
|
-
this._notify();
|
|
122
|
-
}
|
|
123
|
-
/** 이벤트 트리거 (backEvent, homeEvent 등) */
|
|
124
|
-
trigger(event) {
|
|
125
|
-
window.dispatchEvent(new CustomEvent(`__ait:${event}`));
|
|
126
|
-
}
|
|
127
|
-
reset() {
|
|
128
|
-
const deviceId = this._state.deviceId;
|
|
129
|
-
this._state = { ...structuredClone(DEFAULT_STATE), deviceId };
|
|
130
|
-
this._notify();
|
|
131
|
-
}
|
|
132
|
-
_notify() {
|
|
133
|
-
for (const listener of this._listeners) {
|
|
134
|
-
listener();
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
var aitState = new AitStateManager();
|
|
139
|
-
if (typeof window !== "undefined") {
|
|
140
|
-
window.__ait = aitState;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
export {
|
|
144
|
-
aitState
|
|
145
|
-
};
|
|
146
|
-
//# sourceMappingURL=chunk-YYIIG3JT.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mock/state.ts"],"sourcesContent":["/**\n * ait-devtools 중앙 상태 관리\n * DevTools Panel과 mock 구현체가 이 상태를 공유한다.\n */\n\nexport type PlatformOS = 'ios' | 'android';\nexport type OperationalEnvironment = 'toss' | 'sandbox';\nexport type NetworkStatus = 'OFFLINE' | 'WIFI' | '2G' | '3G' | '4G' | '5G' | 'WWAN' | 'UNKNOWN';\nexport type PermissionStatus = 'notDetermined' | 'denied' | 'allowed';\nexport type PermissionName = 'clipboard' | 'contacts' | 'photos' | 'geolocation' | 'camera' | 'microphone';\nexport type HapticFeedbackType = 'tickWeak' | 'tap' | 'tickMedium' | 'softMedium' | 'basicWeak' | 'basicMedium' | 'success' | 'error' | 'wiggle' | 'confetti';\n\nexport interface LocationCoords {\n latitude: number;\n longitude: number;\n altitude: number;\n accuracy: number;\n altitudeAccuracy: number;\n heading: number;\n}\n\nexport interface MockLocation {\n coords: LocationCoords;\n timestamp: number;\n accessLocation?: 'FINE' | 'COARSE';\n}\n\nexport interface MockContact {\n name: string;\n phoneNumber: string;\n}\n\nexport interface MockIapProduct {\n sku: string;\n type: 'CONSUMABLE' | 'NON_CONSUMABLE' | 'SUBSCRIPTION';\n displayName: string;\n displayAmount: string;\n iconUrl: string;\n description: string;\n renewalCycle?: 'WEEKLY' | 'MONTHLY' | 'YEARLY';\n}\n\nexport type IapNextResult = 'success' | 'USER_CANCELED' | 'INVALID_PRODUCT_ID' | 'PAYMENT_PENDING' | 'NETWORK_ERROR' | 'ITEM_ALREADY_OWNED' | 'INTERNAL_ERROR';\n\nexport interface AnalyticsLogEntry {\n timestamp: number;\n type: string;\n params: Record<string, unknown>;\n}\n\nexport interface SafeAreaInsets {\n top: number;\n bottom: number;\n left: number;\n right: number;\n}\n\ntype Listener = () => void;\n\nexport interface AitDevtoolsState {\n // 환경\n platform: PlatformOS;\n environment: OperationalEnvironment;\n appVersion: string;\n locale: string;\n schemeUri: string;\n groupId: string;\n deploymentId: string;\n deviceId: string;\n\n // 브랜드\n brand: {\n displayName: string;\n icon: string;\n primaryColor: string;\n };\n\n // 네트워크\n networkStatus: NetworkStatus;\n\n // 권한\n permissions: Record<PermissionName, PermissionStatus>;\n\n // 위치\n location: MockLocation;\n\n // Safe Area\n safeAreaInsets: SafeAreaInsets;\n\n // 연락처\n contacts: MockContact[];\n\n // IAP\n iap: {\n products: MockIapProduct[];\n nextResult: IapNextResult;\n pendingOrders: Array<{ orderId: string; sku: string; paymentCompletedDate: string }>;\n completedOrders: Array<{ orderId: string; sku: string; status: 'COMPLETED' | 'REFUNDED'; date: string }>;\n };\n\n // 결제 (TossPay)\n payment: {\n nextResult: 'success' | 'fail';\n failReason: string;\n };\n\n // 로그인\n auth: {\n isLoggedIn: boolean;\n isTossLoginIntegrated: boolean;\n userKeyHash: string;\n };\n\n // 광고\n ads: {\n isLoaded: boolean;\n nextEvent: 'loaded' | 'clicked' | 'dismissed' | 'failedToShow' | 'impression' | 'userEarnedReward';\n };\n\n // 게임\n game: {\n profile: { nickname: string; profileImageUri: string } | null;\n leaderboardScores: Array<{ score: string; timestamp: number }>;\n };\n\n // 분석 로그\n analyticsLog: AnalyticsLogEntry[];\n}\n\nconst DEFAULT_STATE: AitDevtoolsState = {\n platform: 'ios',\n environment: 'sandbox',\n appVersion: '5.240.0',\n locale: 'ko-KR',\n schemeUri: '/',\n groupId: 'mock-group-id',\n deploymentId: 'mock-deployment-id',\n deviceId: '',\n\n brand: {\n displayName: 'Mock App',\n icon: '',\n primaryColor: '#3182F6',\n },\n\n networkStatus: 'WIFI',\n\n permissions: {\n clipboard: 'allowed',\n contacts: 'allowed',\n photos: 'allowed',\n geolocation: 'allowed',\n camera: 'allowed',\n microphone: 'notDetermined',\n },\n\n location: {\n coords: {\n latitude: 37.5665,\n longitude: 126.978,\n altitude: 0,\n accuracy: 10,\n altitudeAccuracy: 0,\n heading: 0,\n },\n timestamp: Date.now(),\n accessLocation: 'FINE',\n },\n\n safeAreaInsets: { top: 47, bottom: 34, left: 0, right: 0 },\n\n contacts: [\n { name: '홍길동', phoneNumber: '010-1234-5678' },\n { name: '김토스', phoneNumber: '010-9876-5432' },\n ],\n\n iap: {\n products: [\n {\n sku: 'mock-gem-100',\n type: 'CONSUMABLE',\n displayName: '보석 100개',\n displayAmount: '1,000원',\n iconUrl: '',\n description: '게임에서 사용할 수 있는 보석 100개',\n },\n ],\n nextResult: 'success',\n pendingOrders: [],\n completedOrders: [],\n },\n\n payment: {\n nextResult: 'success',\n failReason: '',\n },\n\n auth: {\n isLoggedIn: true,\n isTossLoginIntegrated: true,\n userKeyHash: 'mock-user-hash-abc123',\n },\n\n ads: {\n isLoaded: false,\n nextEvent: 'loaded',\n },\n\n game: {\n profile: { nickname: 'MockPlayer', profileImageUri: '' },\n leaderboardScores: [],\n },\n\n analyticsLog: [],\n};\n\nfunction generateDeviceId(): string {\n const stored = localStorage.getItem('__ait_device_id');\n if (stored) return stored;\n const id = crypto.randomUUID();\n localStorage.setItem('__ait_device_id', id);\n return id;\n}\n\nclass AitStateManager {\n private _state: AitDevtoolsState;\n private _listeners = new Set<Listener>();\n\n constructor() {\n this._state = structuredClone(DEFAULT_STATE);\n try {\n this._state.deviceId = generateDeviceId();\n } catch {\n this._state.deviceId = 'mock-device-' + Math.random().toString(36).slice(2);\n }\n }\n\n get state(): AitDevtoolsState {\n return this._state;\n }\n\n update(partial: Partial<AitDevtoolsState>) {\n this._state = { ...this._state, ...partial };\n this._notify();\n }\n\n /** 중첩 객체 업데이트용 */\n patch<K extends keyof AitDevtoolsState>(\n key: K,\n partial: Partial<AitDevtoolsState[K]>,\n ) {\n const current = this._state[key];\n if (typeof current === 'object' && current !== null && !Array.isArray(current)) {\n this._state = { ...this._state, [key]: { ...(current as Record<string, unknown>), ...(partial as Record<string, unknown>) } };\n } else {\n this._state = { ...this._state, [key]: partial as AitDevtoolsState[K] };\n }\n this._notify();\n }\n\n subscribe(listener: Listener): () => void {\n this._listeners.add(listener);\n return () => this._listeners.delete(listener);\n }\n\n /** 분석 로그 추가 */\n logAnalytics(entry: Omit<AnalyticsLogEntry, 'timestamp'>) {\n this._state = {\n ...this._state,\n analyticsLog: [...this._state.analyticsLog, { ...entry, timestamp: Date.now() }],\n };\n this._notify();\n }\n\n /** 이벤트 트리거 (backEvent, homeEvent 등) */\n trigger(event: string) {\n window.dispatchEvent(new CustomEvent(`__ait:${event}`));\n }\n\n reset() {\n const deviceId = this._state.deviceId;\n this._state = { ...structuredClone(DEFAULT_STATE), deviceId };\n this._notify();\n }\n\n private _notify() {\n for (const listener of this._listeners) {\n listener();\n }\n }\n}\n\nexport const aitState = new AitStateManager();\n\n// 브라우저 콘솔에서 접근 가능하도록\nif (typeof window !== 'undefined') {\n (window as unknown as Record<string, unknown>).__ait = aitState;\n}\n"],"mappings":"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","names":[]}
|