@zhimakechuang/game-sdk 1.0.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.mjs ADDED
@@ -0,0 +1,260 @@
1
+ // src/platform.ts
2
+ function detectRuntime() {
3
+ if (typeof wx !== "undefined" && typeof wx.request === "function") return "wx";
4
+ if (typeof tt !== "undefined" && typeof tt.request === "function") return "tt";
5
+ return "h5";
6
+ }
7
+ var runtime = detectRuntime();
8
+ async function request(req) {
9
+ if (runtime === "wx" || runtime === "tt") {
10
+ return miniProgramRequest(req);
11
+ }
12
+ return fetchRequest(req);
13
+ }
14
+ function miniProgramRequest(req) {
15
+ const api = runtime === "wx" ? wx : tt;
16
+ return new Promise((resolve, reject) => {
17
+ api.request({
18
+ url: req.url,
19
+ method: req.method,
20
+ header: req.headers || {},
21
+ data: req.body,
22
+ success: (res) => {
23
+ resolve({
24
+ status: res.statusCode,
25
+ data: res.data
26
+ });
27
+ },
28
+ fail: (err) => {
29
+ reject(new Error(err?.errMsg || "request failed"));
30
+ }
31
+ });
32
+ });
33
+ }
34
+ async function fetchRequest(req) {
35
+ const res = await fetch(req.url, {
36
+ method: req.method,
37
+ headers: { "Content-Type": "application/json", ...req.headers },
38
+ body: req.body !== void 0 ? JSON.stringify(req.body) : void 0
39
+ });
40
+ const data = await res.json().catch(() => ({}));
41
+ return { status: res.status, data };
42
+ }
43
+ function storageGet(key) {
44
+ if (runtime === "wx" || runtime === "tt") {
45
+ const api = runtime === "wx" ? wx : tt;
46
+ try {
47
+ const val = api.getStorageSync(key);
48
+ return val || null;
49
+ } catch {
50
+ return null;
51
+ }
52
+ }
53
+ try {
54
+ return localStorage.getItem(key);
55
+ } catch {
56
+ return null;
57
+ }
58
+ }
59
+ function storageSet(key, value) {
60
+ if (runtime === "wx" || runtime === "tt") {
61
+ const api = runtime === "wx" ? wx : tt;
62
+ try {
63
+ api.setStorageSync(key, value);
64
+ } catch {
65
+ }
66
+ return;
67
+ }
68
+ try {
69
+ localStorage.setItem(key, value);
70
+ } catch {
71
+ }
72
+ }
73
+ function storageRemove(key) {
74
+ if (runtime === "wx" || runtime === "tt") {
75
+ const api = runtime === "wx" ? wx : tt;
76
+ try {
77
+ api.removeStorageSync(key);
78
+ } catch {
79
+ }
80
+ return;
81
+ }
82
+ try {
83
+ localStorage.removeItem(key);
84
+ } catch {
85
+ }
86
+ }
87
+
88
+ // src/index.ts
89
+ var GameSdkError = class extends Error {
90
+ constructor(message, status, data) {
91
+ super(message);
92
+ this.status = status;
93
+ this.data = data;
94
+ this.name = "GameSdkError";
95
+ }
96
+ };
97
+ function createGameSdk(config) {
98
+ const apiUrl = `${config.baseUrl}/game-api/${config.gameId}`;
99
+ const tokenKey = `gf_token_${config.gameId}`;
100
+ let token = storageGet(tokenKey);
101
+ function getToken() {
102
+ return token;
103
+ }
104
+ function setToken(t) {
105
+ token = t;
106
+ if (t) storageSet(tokenKey, t);
107
+ else storageRemove(tokenKey);
108
+ }
109
+ async function call(method, path, body) {
110
+ if (config.mock) {
111
+ return mockResponse(method, path, body);
112
+ }
113
+ const headers = {};
114
+ if (token) headers["Authorization"] = `Bearer ${token}`;
115
+ const res = await request({
116
+ url: `${apiUrl}${path}`,
117
+ method,
118
+ headers,
119
+ body
120
+ });
121
+ if (res.status >= 400) {
122
+ const msg = res.data?.message || `HTTP ${res.status}`;
123
+ throw new GameSdkError(msg, res.status, res.data);
124
+ }
125
+ return res.data;
126
+ }
127
+ const sdk = {
128
+ auth: {
129
+ async login(opts) {
130
+ const result = await call("POST", "/auth/login", opts);
131
+ setToken(result.token);
132
+ return result;
133
+ },
134
+ me: () => call("GET", "/auth/me"),
135
+ logout: () => setToken(null),
136
+ getToken
137
+ },
138
+ score: {
139
+ submit: (opts) => call("POST", "/score/submit", opts)
140
+ },
141
+ leaderboard: {
142
+ top: (limit) => call("GET", `/leaderboard?limit=${limit || 100}`),
143
+ myRank: () => call("GET", "/leaderboard/me"),
144
+ nearby: (range) => call("GET", `/leaderboard/nearby?range=${range || 5}`)
145
+ },
146
+ player: {
147
+ getProfile: () => call("GET", "/player/profile"),
148
+ updateProfile: (patch) => call("PATCH", "/player/profile", patch)
149
+ },
150
+ save: {
151
+ set: (key, value) => call("POST", `/storage/${key}`, { value }),
152
+ get: (key) => call("GET", `/storage/${key}`),
153
+ getAll: () => call("GET", "/storage"),
154
+ remove: (key) => call("DELETE", `/storage/${key}`),
155
+ clear: () => call("DELETE", "/storage")
156
+ }
157
+ };
158
+ return sdk;
159
+ }
160
+ var mockScore = 0;
161
+ var mockSaves = {};
162
+ var mockToken = null;
163
+ async function mockResponse(method, path, body) {
164
+ await new Promise((r) => setTimeout(r, 50));
165
+ if (path === "/auth/login") {
166
+ mockToken = `mock_token_${Date.now()}`;
167
+ const profile = {
168
+ openId: "mock_openid",
169
+ platform: body?.platform || "guest",
170
+ nickname: body?.nickname || "\u6D4B\u8BD5\u73A9\u5BB6",
171
+ bestScore: mockScore,
172
+ playCount: 0,
173
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
174
+ lastSeenAt: (/* @__PURE__ */ new Date()).toISOString()
175
+ };
176
+ return { token: mockToken, openId: "mock_openid", isNew: true, profile };
177
+ }
178
+ if (path === "/auth/me") {
179
+ return {
180
+ openId: "mock_openid",
181
+ platform: "guest",
182
+ nickname: "\u6D4B\u8BD5\u73A9\u5BB6",
183
+ bestScore: mockScore,
184
+ playCount: 1,
185
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
186
+ lastSeenAt: (/* @__PURE__ */ new Date()).toISOString()
187
+ };
188
+ }
189
+ if (path === "/score/submit") {
190
+ const prev = mockScore;
191
+ mockScore = Math.max(mockScore, body?.score || 0);
192
+ return {
193
+ submitted: body?.score || 0,
194
+ isHighScore: (body?.score || 0) > prev,
195
+ previousBest: prev,
196
+ bestScore: mockScore,
197
+ rank: 1
198
+ };
199
+ }
200
+ if (path.startsWith("/leaderboard?")) {
201
+ return [{
202
+ rank: 1,
203
+ openId: "mock***oid",
204
+ nickname: "\u6D4B\u8BD5\u73A9\u5BB6",
205
+ score: mockScore,
206
+ isSelf: true
207
+ }];
208
+ }
209
+ if (path === "/leaderboard/me") {
210
+ return { rank: 1, score: mockScore, totalPlayers: 1, playCount: 1 };
211
+ }
212
+ if (path.startsWith("/leaderboard/nearby")) {
213
+ return [{
214
+ rank: 1,
215
+ openId: "mock***oid",
216
+ nickname: "\u6D4B\u8BD5\u73A9\u5BB6",
217
+ score: mockScore,
218
+ isSelf: true
219
+ }];
220
+ }
221
+ if (path === "/player/profile" && method === "GET") {
222
+ return {
223
+ openId: "mock_openid",
224
+ platform: "guest",
225
+ nickname: "\u6D4B\u8BD5\u73A9\u5BB6",
226
+ bestScore: mockScore,
227
+ playCount: 1,
228
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
229
+ lastSeenAt: (/* @__PURE__ */ new Date()).toISOString()
230
+ };
231
+ }
232
+ if (path.startsWith("/storage/") && method === "POST") {
233
+ const key = path.split("/storage/")[1];
234
+ mockSaves[key] = body?.value || {};
235
+ return { success: true, key, value: mockSaves[key] };
236
+ }
237
+ if (path.startsWith("/storage/") && method === "GET") {
238
+ const key = path.split("/storage/")[1];
239
+ return mockSaves[key] || null;
240
+ }
241
+ if (path === "/storage" && method === "GET") {
242
+ return mockSaves;
243
+ }
244
+ if (path.startsWith("/storage/") && method === "DELETE") {
245
+ const key = path.split("/storage/")[1];
246
+ delete mockSaves[key];
247
+ return { success: true, key };
248
+ }
249
+ if (path === "/storage" && method === "DELETE") {
250
+ const count = Object.keys(mockSaves).length;
251
+ mockSaves = {};
252
+ return { success: true, deleted: count };
253
+ }
254
+ return {};
255
+ }
256
+ export {
257
+ GameSdkError,
258
+ createGameSdk
259
+ };
260
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/platform.ts","../src/index.ts"],"sourcesContent":["/**\r\n * 平台适配层\r\n *\r\n * 自动检测运行环境(微信小游戏 / 抖音小游戏 / H5),\r\n * 封装 HTTP 请求和本地存储,对上层提供统一接口。\r\n */\r\n\r\n// 小游戏运行时的全局对象(微信/抖音),H5 下不存在\r\ndeclare const wx: any;\r\ndeclare const tt: any;\r\n\r\n// ─── 环境检测 ──────────────────────────────────────────\r\n\r\ntype Runtime = 'wx' | 'tt' | 'h5';\r\n\r\nfunction detectRuntime(): Runtime {\r\n if (typeof wx !== 'undefined' && typeof (wx as any).request === 'function') return 'wx';\r\n if (typeof tt !== 'undefined' && typeof (tt as any).request === 'function') return 'tt';\r\n return 'h5';\r\n}\r\n\r\nconst runtime = detectRuntime();\r\n\r\n// ─── HTTP 请求 ─────────────────────────────────────────\r\n\r\nexport interface HttpRequest {\r\n url: string;\r\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\r\n headers?: Record<string, string>;\r\n body?: any;\r\n}\r\n\r\nexport interface HttpResponse<T = any> {\r\n status: number;\r\n data: T;\r\n}\r\n\r\nexport async function request<T = any>(req: HttpRequest): Promise<HttpResponse<T>> {\r\n if (runtime === 'wx' || runtime === 'tt') {\r\n return miniProgramRequest<T>(req);\r\n }\r\n return fetchRequest<T>(req);\r\n}\r\n\r\n/** 微信/抖音小游戏请求(wx.request / tt.request) */\r\nfunction miniProgramRequest<T>(req: HttpRequest): Promise<HttpResponse<T>> {\r\n const api = (runtime === 'wx' ? wx : tt) as any;\r\n return new Promise((resolve, reject) => {\r\n api.request({\r\n url: req.url,\r\n method: req.method,\r\n header: req.headers || {},\r\n data: req.body,\r\n success: (res: any) => {\r\n resolve({\r\n status: res.statusCode,\r\n data: res.data as T,\r\n });\r\n },\r\n fail: (err: any) => {\r\n reject(new Error(err?.errMsg || 'request failed'));\r\n },\r\n });\r\n });\r\n}\r\n\r\n/** H5 fetch 请求 */\r\nasync function fetchRequest<T>(req: HttpRequest): Promise<HttpResponse<T>> {\r\n const res = await fetch(req.url, {\r\n method: req.method,\r\n headers: { 'Content-Type': 'application/json', ...req.headers },\r\n body: req.body !== undefined ? JSON.stringify(req.body) : undefined,\r\n });\r\n const data = await res.json().catch(() => ({}));\r\n return { status: res.status, data: data as T };\r\n}\r\n\r\n// ─── 本地存储(token 持久化)────────────────────────────\r\n\r\nexport function storageGet(key: string): string | null {\r\n if (runtime === 'wx' || runtime === 'tt') {\r\n const api = (runtime === 'wx' ? wx : tt) as any;\r\n try {\r\n const val = api.getStorageSync(key);\r\n return val || null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n try {\r\n return localStorage.getItem(key);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function storageSet(key: string, value: string): void {\r\n if (runtime === 'wx' || runtime === 'tt') {\r\n const api = (runtime === 'wx' ? wx : tt) as any;\r\n try {\r\n api.setStorageSync(key, value);\r\n } catch {\r\n /* ignore */\r\n }\r\n return;\r\n }\r\n try {\r\n localStorage.setItem(key, value);\r\n } catch {\r\n /* ignore */\r\n }\r\n}\r\n\r\nexport function storageRemove(key: string): void {\r\n if (runtime === 'wx' || runtime === 'tt') {\r\n const api = (runtime === 'wx' ? wx : tt) as any;\r\n try {\r\n api.removeStorageSync(key);\r\n } catch {\r\n /* ignore */\r\n }\r\n return;\r\n }\r\n try {\r\n localStorage.removeItem(key);\r\n } catch {\r\n /* ignore */\r\n }\r\n}\r\n","/**\r\n * @game-factory/game-sdk\r\n *\r\n * 通用游戏 SDK,封装 game-server-shared 所有 HTTP 接口。\r\n *\r\n * 用法(工程化):\r\n * import { createGameSdk } from '@game-factory/game-sdk';\r\n * const sdk = createGameSdk({ gameId: 'merge-game', baseUrl: 'https://api.example.com' });\r\n * await sdk.auth.login({ code: 'xxx', platform: 'wx' });\r\n * await sdk.score.submit({ score: 1000 });\r\n *\r\n * 用法(CDN):\r\n * <script src=\"https://cdn.example.com/game-sdk/index.umd.js\"></script>\r\n * const sdk = GameSDK.createGameSdk({ gameId: 'merge-game', baseUrl: '...' });\r\n *\r\n * 用法(模拟模式,不连服务端):\r\n * const sdk = createGameSdk({ gameId: 'demo', baseUrl: '', mock: true });\r\n */\r\n\r\nimport {\r\n GameSdkConfig, LoginOptions, LoginResult, PlayerProfile,\r\n SubmitScoreOptions, SubmitScoreResult,\r\n LeaderboardEntry, MyRank,\r\n} from './types';\r\nimport { request, storageGet, storageSet, storageRemove } from './platform';\r\n\r\n// re-export 所有类型,供外部使用\r\nexport * from './types';\r\n\r\n// ─── 错误 ──────────────────────────────────────────────\r\n\r\nexport class GameSdkError extends Error {\r\n constructor(\r\n message: string,\r\n public status: number,\r\n public data?: any,\r\n ) {\r\n super(message);\r\n this.name = 'GameSdkError';\r\n }\r\n}\r\n\r\n// ─── SDK 接口定义 ───────────────────────────────────────\r\n\r\nexport interface GameSdk {\r\n /** 身份与登录 */\r\n auth: {\r\n /** 登录(微信/抖音/访客),成功后自动持久化 token */\r\n login(opts: LoginOptions): Promise<LoginResult>;\r\n /** 获取当前登录玩家信息(需先 login) */\r\n me(): Promise<PlayerProfile>;\r\n /** 登出,清除本地 token */\r\n logout(): void;\r\n /** 获取当前 token(用于调试) */\r\n getToken(): string | null;\r\n };\r\n /** 分数 */\r\n score: {\r\n /** 提交分数(需登录) */\r\n submit(opts: SubmitScoreOptions): Promise<SubmitScoreResult>;\r\n };\r\n /** 排行榜 */\r\n leaderboard: {\r\n /** 获取 Top N(匿名可访问,limit 默认 100) */\r\n top(limit?: number): Promise<LeaderboardEntry[]>;\r\n /** 获取当前玩家排名(需登录) */\r\n myRank(): Promise<MyRank>;\r\n /** 获取附近排名(需登录,range 默认 ±5) */\r\n nearby(range?: number): Promise<LeaderboardEntry[]>;\r\n };\r\n /** 玩家档案 */\r\n player: {\r\n /** 获取当前玩家档案(需登录) */\r\n getProfile(): Promise<PlayerProfile>;\r\n /** 更新档案(昵称/头像/扩展字段) */\r\n updateProfile(patch: {\r\n nickname?: string;\r\n avatarUrl?: string;\r\n extra?: Record<string, any>;\r\n }): Promise<PlayerProfile>;\r\n };\r\n /** 云存档(KV) */\r\n save: {\r\n /** 保存数据到指定 key */\r\n set(key: string, value: Record<string, any>): Promise<{ success: boolean; key: string; value: Record<string, any> }>;\r\n /** 读取指定 key 的数据 */\r\n get(key: string): Promise<Record<string, any> | null>;\r\n /** 读取所有存档 */\r\n getAll(): Promise<Record<string, any>>;\r\n /** 删除指定 key */\r\n remove(key: string): Promise<{ success: boolean; key: string }>;\r\n /** 清空所有存档 */\r\n clear(): Promise<{ success: boolean; deleted: number }>;\r\n };\r\n}\r\n\r\n// ─── 创建 SDK ───────────────────────────────────────────\r\n\r\nexport function createGameSdk(config: GameSdkConfig): GameSdk {\r\n const apiUrl = `${config.baseUrl}/game-api/${config.gameId}`;\r\n const tokenKey = `gf_token_${config.gameId}`;\r\n\r\n // token 管理(从本地存储恢复)\r\n let token: string | null = storageGet(tokenKey);\r\n\r\n function getToken(): string | null {\r\n return token;\r\n }\r\n\r\n function setToken(t: string | null): void {\r\n token = t;\r\n if (t) storageSet(tokenKey, t);\r\n else storageRemove(tokenKey);\r\n }\r\n\r\n // ── 内部 HTTP 封装 ──────────────────────────────────\r\n async function call<T = any>(\r\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE',\r\n path: string,\r\n body?: any,\r\n ): Promise<T> {\r\n if (config.mock) {\r\n return mockResponse<T>(method, path, body);\r\n }\r\n\r\n const headers: Record<string, string> = {};\r\n if (token) headers['Authorization'] = `Bearer ${token}`;\r\n\r\n const res = await request<T>({\r\n url: `${apiUrl}${path}`,\r\n method,\r\n headers,\r\n body,\r\n });\r\n\r\n if (res.status >= 400) {\r\n const msg = (res.data as any)?.message || `HTTP ${res.status}`;\r\n throw new GameSdkError(msg, res.status, res.data);\r\n }\r\n return res.data;\r\n }\r\n\r\n // ── 方法面 ──────────────────────────────────────────\r\n const sdk: GameSdk = {\r\n auth: {\r\n async login(opts: LoginOptions): Promise<LoginResult> {\r\n const result = await call<LoginResult>('POST', '/auth/login', opts);\r\n setToken(result.token);\r\n return result;\r\n },\r\n me: () => call<PlayerProfile>('GET', '/auth/me'),\r\n logout: () => setToken(null),\r\n getToken,\r\n },\r\n\r\n score: {\r\n submit: (opts: SubmitScoreOptions) => call<SubmitScoreResult>('POST', '/score/submit', opts),\r\n },\r\n\r\n leaderboard: {\r\n top: (limit?: number) =>\r\n call<LeaderboardEntry[]>('GET', `/leaderboard?limit=${limit || 100}`),\r\n myRank: () => call<MyRank>('GET', '/leaderboard/me'),\r\n nearby: (range?: number) =>\r\n call<LeaderboardEntry[]>('GET', `/leaderboard/nearby?range=${range || 5}`),\r\n },\r\n\r\n player: {\r\n getProfile: () => call<PlayerProfile>('GET', '/player/profile'),\r\n updateProfile: (patch) => call<PlayerProfile>('PATCH', '/player/profile', patch),\r\n },\r\n\r\n save: {\r\n set: (key, value) => call('POST', `/storage/${key}`, { value }),\r\n get: (key) => call('GET', `/storage/${key}`),\r\n getAll: () => call('GET', '/storage'),\r\n remove: (key) => call('DELETE', `/storage/${key}`),\r\n clear: () => call('DELETE', '/storage'),\r\n },\r\n };\r\n\r\n return sdk;\r\n}\r\n\r\n// ─── Mock 模式(模板开发不连服务端)──────────────────────\r\n\r\nlet mockScore = 0;\r\nlet mockSaves: Record<string, Record<string, any>> = {};\r\nlet mockToken: string | null = null;\r\n\r\nasync function mockResponse<T>(method: string, path: string, body: any): Promise<T> {\r\n await new Promise((r) => setTimeout(r, 50)); // 模拟网络延迟\r\n\r\n // auth\r\n if (path === '/auth/login') {\r\n mockToken = `mock_token_${Date.now()}`;\r\n const profile: PlayerProfile = {\r\n openId: 'mock_openid',\r\n platform: body?.platform || 'guest',\r\n nickname: body?.nickname || '测试玩家',\r\n bestScore: mockScore,\r\n playCount: 0,\r\n createdAt: new Date().toISOString(),\r\n lastSeenAt: new Date().toISOString(),\r\n };\r\n return { token: mockToken, openId: 'mock_openid', isNew: true, profile } as T;\r\n }\r\n if (path === '/auth/me') {\r\n return {\r\n openId: 'mock_openid',\r\n platform: 'guest',\r\n nickname: '测试玩家',\r\n bestScore: mockScore,\r\n playCount: 1,\r\n createdAt: new Date().toISOString(),\r\n lastSeenAt: new Date().toISOString(),\r\n } as T;\r\n }\r\n\r\n // score\r\n if (path === '/score/submit') {\r\n const prev = mockScore;\r\n mockScore = Math.max(mockScore, body?.score || 0);\r\n return {\r\n submitted: body?.score || 0,\r\n isHighScore: (body?.score || 0) > prev,\r\n previousBest: prev,\r\n bestScore: mockScore,\r\n rank: 1,\r\n } as T;\r\n }\r\n\r\n // leaderboard\r\n if (path.startsWith('/leaderboard?')) {\r\n return [{\r\n rank: 1,\r\n openId: 'mock***oid',\r\n nickname: '测试玩家',\r\n score: mockScore,\r\n isSelf: true,\r\n }] as T;\r\n }\r\n if (path === '/leaderboard/me') {\r\n return { rank: 1, score: mockScore, totalPlayers: 1, playCount: 1 } as T;\r\n }\r\n if (path.startsWith('/leaderboard/nearby')) {\r\n return [{\r\n rank: 1,\r\n openId: 'mock***oid',\r\n nickname: '测试玩家',\r\n score: mockScore,\r\n isSelf: true,\r\n }] as T;\r\n }\r\n\r\n // player\r\n if (path === '/player/profile' && method === 'GET') {\r\n return {\r\n openId: 'mock_openid',\r\n platform: 'guest',\r\n nickname: '测试玩家',\r\n bestScore: mockScore,\r\n playCount: 1,\r\n createdAt: new Date().toISOString(),\r\n lastSeenAt: new Date().toISOString(),\r\n } as T;\r\n }\r\n\r\n // storage\r\n if (path.startsWith('/storage/') && method === 'POST') {\r\n const key = path.split('/storage/')[1];\r\n mockSaves[key] = body?.value || {};\r\n return { success: true, key, value: mockSaves[key] } as T;\r\n }\r\n if (path.startsWith('/storage/') && method === 'GET') {\r\n const key = path.split('/storage/')[1];\r\n return (mockSaves[key] || null) as T;\r\n }\r\n if (path === '/storage' && method === 'GET') {\r\n return mockSaves as T;\r\n }\r\n if (path.startsWith('/storage/') && method === 'DELETE') {\r\n const key = path.split('/storage/')[1];\r\n delete mockSaves[key];\r\n return { success: true, key } as T;\r\n }\r\n if (path === '/storage' && method === 'DELETE') {\r\n const count = Object.keys(mockSaves).length;\r\n mockSaves = {};\r\n return { success: true, deleted: count } as T;\r\n }\r\n\r\n return {} as T;\r\n}\r\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "@zhimakechuang/game-sdk",
3
+ "version": "1.0.0",
4
+ "description": "通用游戏 SDK - 封装 game-server-shared 所有 HTTP 接口,支持微信/抖音/H5",
5
+ "homepage": "https://github.com/Chuang0516/game-factory/tree/main/packages/game-sdk",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/Chuang0516/game-factory.git",
9
+ "directory": "packages/game-sdk"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/Chuang0516/game-factory/issues"
13
+ },
14
+ "main": "./dist/index.js",
15
+ "module": "./dist/index.mjs",
16
+ "unpkg": "./dist/index.global.js",
17
+ "sideEffects": false,
18
+ "types": "./dist/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "import": "./dist/index.mjs",
23
+ "require": "./dist/index.js"
24
+ }
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "README.md"
29
+ ],
30
+ "scripts": {
31
+ "build": "tsup",
32
+ "dev": "tsup --watch",
33
+ "clean": "rimraf dist",
34
+ "prepublishOnly": "tsup",
35
+ "publish:patch": "npm version patch && npm publish",
36
+ "publish:minor": "npm version minor && npm publish",
37
+ "publish:major": "npm version major && npm publish"
38
+ },
39
+ "keywords": [
40
+ "game",
41
+ "sdk",
42
+ "leaderboard",
43
+ "score",
44
+ "miniprogram",
45
+ "wechat",
46
+ "douyin",
47
+ "nestjs"
48
+ ],
49
+ "license": "MIT",
50
+ "publishConfig": {
51
+ "registry": "https://registry.npmjs.org/",
52
+ "access": "public"
53
+ },
54
+ "engines": {
55
+ "node": ">=16.0.0"
56
+ },
57
+ "devDependencies": {
58
+ "tsup": "^8.0.0",
59
+ "typescript": "^5.4.0"
60
+ }
61
+ }
62
+