@leonxin/meetgames 0.1.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/README.md +120 -0
- package/bundled/android/sample.txt +1 -0
- package/dist/android/adapter.d.ts +3 -0
- package/dist/android/adapter.d.ts.map +1 -0
- package/dist/android/adapter.js +8 -0
- package/dist/android/adapter.js.map +1 -0
- package/dist/android/assembleIntegrationJson.d.ts +8 -0
- package/dist/android/assembleIntegrationJson.d.ts.map +1 -0
- package/dist/android/assembleIntegrationJson.js +31 -0
- package/dist/android/assembleIntegrationJson.js.map +1 -0
- package/dist/android/detect.d.ts +11 -0
- package/dist/android/detect.d.ts.map +1 -0
- package/dist/android/detect.js +87 -0
- package/dist/android/detect.js.map +1 -0
- package/dist/android/downloadGoogleServicesJson.d.ts +20 -0
- package/dist/android/downloadGoogleServicesJson.d.ts.map +1 -0
- package/dist/android/downloadGoogleServicesJson.js +43 -0
- package/dist/android/downloadGoogleServicesJson.js.map +1 -0
- package/dist/android/fetchRemoteConfig.d.ts +5 -0
- package/dist/android/fetchRemoteConfig.d.ts.map +1 -0
- package/dist/android/fetchRemoteConfig.js +24 -0
- package/dist/android/fetchRemoteConfig.js.map +1 -0
- package/dist/android/gradle.d.ts +30 -0
- package/dist/android/gradle.d.ts.map +1 -0
- package/dist/android/gradle.js +87 -0
- package/dist/android/gradle.js.map +1 -0
- package/dist/android/manifest.d.ts +10 -0
- package/dist/android/manifest.d.ts.map +1 -0
- package/dist/android/manifest.js +45 -0
- package/dist/android/manifest.js.map +1 -0
- package/dist/android/meetSdkRemoteGradle.d.ts +86 -0
- package/dist/android/meetSdkRemoteGradle.d.ts.map +1 -0
- package/dist/android/meetSdkRemoteGradle.js +479 -0
- package/dist/android/meetSdkRemoteGradle.js.map +1 -0
- package/dist/android/snapchatManifestPlaceholders.d.ts +15 -0
- package/dist/android/snapchatManifestPlaceholders.d.ts.map +1 -0
- package/dist/android/snapchatManifestPlaceholders.js +53 -0
- package/dist/android/snapchatManifestPlaceholders.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +291 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/fetchConfigWrite.d.ts +10 -0
- package/dist/config/fetchConfigWrite.d.ts.map +1 -0
- package/dist/config/fetchConfigWrite.js +21 -0
- package/dist/config/fetchConfigWrite.js.map +1 -0
- package/dist/config/loadAndroidIntegration.d.ts +4 -0
- package/dist/config/loadAndroidIntegration.d.ts.map +1 -0
- package/dist/config/loadAndroidIntegration.js +34 -0
- package/dist/config/loadAndroidIntegration.js.map +1 -0
- package/dist/config/loadManifest.d.ts +3 -0
- package/dist/config/loadManifest.d.ts.map +1 -0
- package/dist/config/loadManifest.js +33 -0
- package/dist/config/loadManifest.js.map +1 -0
- package/dist/config/meetSdkDefaultConfig.d.ts +5 -0
- package/dist/config/meetSdkDefaultConfig.d.ts.map +1 -0
- package/dist/config/meetSdkDefaultConfig.js +15 -0
- package/dist/config/meetSdkDefaultConfig.js.map +1 -0
- package/dist/config/meetSdkRemoteConfig.d.ts +240 -0
- package/dist/config/meetSdkRemoteConfig.d.ts.map +1 -0
- package/dist/config/meetSdkRemoteConfig.js +892 -0
- package/dist/config/meetSdkRemoteConfig.js.map +1 -0
- package/dist/config/topsdkFeatureModules.d.ts +19 -0
- package/dist/config/topsdkFeatureModules.d.ts.map +1 -0
- package/dist/config/topsdkFeatureModules.js +47 -0
- package/dist/config/topsdkFeatureModules.js.map +1 -0
- package/dist/contracts/types.d.ts +95 -0
- package/dist/contracts/types.d.ts.map +1 -0
- package/dist/contracts/types.js +2 -0
- package/dist/contracts/types.js.map +1 -0
- package/dist/core/engine.d.ts +3 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +18 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/patch.d.ts +2 -0
- package/dist/core/patch.d.ts.map +1 -0
- package/dist/core/patch.js +61 -0
- package/dist/core/patch.js.map +1 -0
- package/dist/core/pipeline.d.ts +12 -0
- package/dist/core/pipeline.d.ts.map +1 -0
- package/dist/core/pipeline.js +102 -0
- package/dist/core/pipeline.js.map +1 -0
- package/dist/core/previewPatches.d.ts +8 -0
- package/dist/core/previewPatches.d.ts.map +1 -0
- package/dist/core/previewPatches.js +25 -0
- package/dist/core/previewPatches.js.map +1 -0
- package/dist/core/reporter.d.ts +3 -0
- package/dist/core/reporter.d.ts.map +1 -0
- package/dist/core/reporter.js +24 -0
- package/dist/core/reporter.js.map +1 -0
- package/dist/core/resolveFetchChannelType.d.ts +27 -0
- package/dist/core/resolveFetchChannelType.d.ts.map +1 -0
- package/dist/core/resolveFetchChannelType.js +54 -0
- package/dist/core/resolveFetchChannelType.js.map +1 -0
- package/dist/core/workspace.d.ts +5 -0
- package/dist/core/workspace.d.ts.map +1 -0
- package/dist/core/workspace.js +24 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/entry.d.ts +3 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +7 -0
- package/dist/entry.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/ios/channelConfig.d.ts +7 -0
- package/dist/ios/channelConfig.d.ts.map +1 -0
- package/dist/ios/channelConfig.js +51 -0
- package/dist/ios/channelConfig.js.map +1 -0
- package/dist/ios/codeUtils.d.ts +15 -0
- package/dist/ios/codeUtils.d.ts.map +1 -0
- package/dist/ios/codeUtils.js +166 -0
- package/dist/ios/codeUtils.js.map +1 -0
- package/dist/ios/detect.d.ts +3 -0
- package/dist/ios/detect.d.ts.map +1 -0
- package/dist/ios/detect.js +65 -0
- package/dist/ios/detect.js.map +1 -0
- package/dist/ios/fileManager.d.ts +12 -0
- package/dist/ios/fileManager.d.ts.map +1 -0
- package/dist/ios/fileManager.js +46 -0
- package/dist/ios/fileManager.js.map +1 -0
- package/dist/ios/infoPlist.d.ts +11 -0
- package/dist/ios/infoPlist.d.ts.map +1 -0
- package/dist/ios/infoPlist.js +48 -0
- package/dist/ios/infoPlist.js.map +1 -0
- package/dist/ios/integrate.d.ts +12 -0
- package/dist/ios/integrate.d.ts.map +1 -0
- package/dist/ios/integrate.js +263 -0
- package/dist/ios/integrate.js.map +1 -0
- package/dist/ios/pbxprojEditor.d.ts +20 -0
- package/dist/ios/pbxprojEditor.d.ts.map +1 -0
- package/dist/ios/pbxprojEditor.js +198 -0
- package/dist/ios/pbxprojEditor.js.map +1 -0
- package/dist/ios/pluginConfig.d.ts +6 -0
- package/dist/ios/pluginConfig.d.ts.map +1 -0
- package/dist/ios/pluginConfig.js +64 -0
- package/dist/ios/pluginConfig.js.map +1 -0
- package/dist/ios/reserved.d.ts +4 -0
- package/dist/ios/reserved.d.ts.map +1 -0
- package/dist/ios/reserved.js +6 -0
- package/dist/ios/reserved.js.map +1 -0
- package/dist/ios/sdkBundle.d.ts +7 -0
- package/dist/ios/sdkBundle.d.ts.map +1 -0
- package/dist/ios/sdkBundle.js +30 -0
- package/dist/ios/sdkBundle.js.map +1 -0
- package/dist/ios/template.d.ts +3 -0
- package/dist/ios/template.d.ts.map +1 -0
- package/dist/ios/template.js +24 -0
- package/dist/ios/template.js.map +1 -0
- package/dist/ios/types.d.ts +43 -0
- package/dist/ios/types.d.ts.map +1 -0
- package/dist/ios/types.js +11 -0
- package/dist/ios/types.js.map +1 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +139 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/service.d.ts +49 -0
- package/dist/mcp/service.d.ts.map +1 -0
- package/dist/mcp/service.js +113 -0
- package/dist/mcp/service.js.map +1 -0
- package/dist/mcp-entry.d.ts +3 -0
- package/dist/mcp-entry.d.ts.map +1 -0
- package/dist/mcp-entry.js +7 -0
- package/dist/mcp-entry.js.map +1 -0
- package/dist/ops/fileStore.d.ts +17 -0
- package/dist/ops/fileStore.d.ts.map +1 -0
- package/dist/ops/fileStore.js +55 -0
- package/dist/ops/fileStore.js.map +1 -0
- package/dist/ops/handlers.d.ts +10 -0
- package/dist/ops/handlers.d.ts.map +1 -0
- package/dist/ops/handlers.js +268 -0
- package/dist/ops/handlers.js.map +1 -0
- package/dist/platforms/android/adapter.d.ts +3 -0
- package/dist/platforms/android/adapter.d.ts.map +1 -0
- package/dist/platforms/android/adapter.js +8 -0
- package/dist/platforms/android/adapter.js.map +1 -0
- package/dist/platforms/android/detect.d.ts +3 -0
- package/dist/platforms/android/detect.d.ts.map +1 -0
- package/dist/platforms/android/detect.js +79 -0
- package/dist/platforms/android/detect.js.map +1 -0
- package/dist/platforms/android/gradle.d.ts +30 -0
- package/dist/platforms/android/gradle.d.ts.map +1 -0
- package/dist/platforms/android/gradle.js +83 -0
- package/dist/platforms/android/gradle.js.map +1 -0
- package/dist/platforms/android/manifest.d.ts +7 -0
- package/dist/platforms/android/manifest.d.ts.map +1 -0
- package/dist/platforms/android/manifest.js +24 -0
- package/dist/platforms/android/manifest.js.map +1 -0
- package/dist/platforms/ios/adapter.d.ts +3 -0
- package/dist/platforms/ios/adapter.d.ts.map +1 -0
- package/dist/platforms/ios/adapter.js +8 -0
- package/dist/platforms/ios/adapter.js.map +1 -0
- package/dist/platforms/ios/detect.d.ts +8 -0
- package/dist/platforms/ios/detect.d.ts.map +1 -0
- package/dist/platforms/ios/detect.js +67 -0
- package/dist/platforms/ios/detect.js.map +1 -0
- package/dist/platforms/ios/plist.d.ts +11 -0
- package/dist/platforms/ios/plist.d.ts.map +1 -0
- package/dist/platforms/ios/plist.js +24 -0
- package/dist/platforms/ios/plist.js.map +1 -0
- package/dist/platforms/ios/podfile.d.ts +7 -0
- package/dist/platforms/ios/podfile.d.ts.map +1 -0
- package/dist/platforms/ios/podfile.js +15 -0
- package/dist/platforms/ios/podfile.js.map +1 -0
- package/dist/remote/fetchJson.d.ts +5 -0
- package/dist/remote/fetchJson.d.ts.map +1 -0
- package/dist/remote/fetchJson.js +24 -0
- package/dist/remote/fetchJson.js.map +1 -0
- package/dist/remote/topsdkDownloadSdkConfig.d.ts +23 -0
- package/dist/remote/topsdkDownloadSdkConfig.d.ts.map +1 -0
- package/dist/remote/topsdkDownloadSdkConfig.js +56 -0
- package/dist/remote/topsdkDownloadSdkConfig.js.map +1 -0
- package/dist/remote/topsdkGetSdkConfig.d.ts +46 -0
- package/dist/remote/topsdkGetSdkConfig.d.ts.map +1 -0
- package/dist/remote/topsdkGetSdkConfig.js +95 -0
- package/dist/remote/topsdkGetSdkConfig.js.map +1 -0
- package/dist/remote/topsdkSign.d.ts +6 -0
- package/dist/remote/topsdkSign.d.ts.map +1 -0
- package/dist/remote/topsdkSign.js +10 -0
- package/dist/remote/topsdkSign.js.map +1 -0
- package/docs/ANDROID.md +133 -0
- package/docs/API.md +47 -0
- package/docs/CURSOR-MCP-SETUP.md +72 -0
- package/docs/MCP-SKILL.md +63 -0
- package/docs/README.md +12 -0
- package/docs/api/downloadSDKConfig.md +96 -0
- package/docs/api/getChannelConfig-meetgames.md +106 -0
- package/docs/api/getSDKConfig.md +38 -0
- package/docs//346/212/200/346/234/257/346/226/271/346/241/210/350/260/203/347/240/224.md +329 -0
- package/docs//351/234/200/346/261/202/346/226/207/346/241/243.md +320 -0
- package/fixtures/api-samples/getChannelConfig-meetgames.sample.json +123 -0
- package/fixtures/meetsdk-remote-config.download-shape.json +20 -0
- package/fixtures/meetsdk-remote-config.mock.json +69 -0
- package/fixtures/recipes/android-default.fixture.yaml +15 -0
- package/fixtures/recipes/android-integration.fixture.json +29 -0
- package/fixtures/topsdk-config-reference.json +39 -0
- package/meetsdk-android.json +151 -0
- package/package.json +61 -0
- package/recipes/android-default.yaml +15 -0
- package/recipes/integrate-default.yaml +16 -0
- package/recipes/ios-default.yaml +5 -0
- package/schema/android-integration.schema.json +65 -0
- package/schema/manifest.schema.json +45 -0
- package/schema/meetsdk-remote-config.schema.json +45 -0
package/README.md
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# @leonxin/meetgames
|
|
2
|
+
|
|
3
|
+
Meet SDK 集成 CLI:从 gp-sdk 拉取渠道配置,自动修改 Android Gradle / Manifest 与 iOS Xcode 工程。
|
|
4
|
+
|
|
5
|
+
- **远程配置**(每游戏不同):`meetsdk-remote-config.json` — 由 `fetch-config` 从 `downloadSDKConfig` **原样落盘**
|
|
6
|
+
- **固定 SDK 配置**(全游戏通用):内置 `meetsdk-android.json` — 仅在 `integrate` 时在内存中合并
|
|
7
|
+
|
|
8
|
+
要求 **Node.js ≥ 18**。宿主工程需为**纯原生** Android / iOS 项目。
|
|
9
|
+
|
|
10
|
+
## 安装
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
# 全局安装(推荐 CI / 本地反复使用)
|
|
14
|
+
npm install -g @leonxin/meetgames
|
|
15
|
+
|
|
16
|
+
# 或一次性执行
|
|
17
|
+
npx @leonxin/meetgames@latest --help
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
安装后可使用命令 **`meetgames`** 与 **`meetgames-mcp`**(MCP 服务)。
|
|
21
|
+
|
|
22
|
+
## 快速开始
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# 1. 检测工程
|
|
26
|
+
meetgames doctor --project-root /path/to/android-project
|
|
27
|
+
|
|
28
|
+
# 2. 拉取远程配置 → 工程根目录 meetsdk-remote-config.json
|
|
29
|
+
meetgames fetch-config \
|
|
30
|
+
--project-root /path/to/android-project \
|
|
31
|
+
--app-id 791251136341225472 \
|
|
32
|
+
--channel-type GOOGLE \
|
|
33
|
+
--env test
|
|
34
|
+
|
|
35
|
+
# 3. 集成(可先 --dry-run 预览)
|
|
36
|
+
meetgames integrate --project-root /path/to/android-project --dry-run --verbose
|
|
37
|
+
|
|
38
|
+
# 4. 拉取 + 集成一步完成
|
|
39
|
+
meetgames setup \
|
|
40
|
+
--project-root /path/to/android-project \
|
|
41
|
+
--app-id 791251136341225472 \
|
|
42
|
+
--channel-type GOOGLE \
|
|
43
|
+
--env test
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 环境变量
|
|
47
|
+
|
|
48
|
+
| 变量 | 说明 |
|
|
49
|
+
|------|------|
|
|
50
|
+
| `TOPSDK_API_BASE_URL` | 覆盖 API 根地址(本地 gp-sdk console 联调) |
|
|
51
|
+
| `TOPSDK_CHANNEL_TYPE` | 默认渠道类型 |
|
|
52
|
+
| `TOPSDK_APP_ID` | 默认 appId |
|
|
53
|
+
|
|
54
|
+
默认 API 环境由 `--env` 控制:`prod`(默认)/ `pre` / `test`。
|
|
55
|
+
|
|
56
|
+
本地 console 示例:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
TOPSDK_API_BASE_URL=http://localhost:8081/ \
|
|
60
|
+
meetgames fetch-config \
|
|
61
|
+
--project-root . \
|
|
62
|
+
--app-id <appId> \
|
|
63
|
+
--channel-type GOOGLE
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## 子命令
|
|
67
|
+
|
|
68
|
+
| 命令 | 作用 |
|
|
69
|
+
|------|------|
|
|
70
|
+
| `doctor` | 检测工程类型与路径 |
|
|
71
|
+
| `fetch-config` | GET `downloadSDKConfig`,原样写入 `meetsdk-remote-config.json` |
|
|
72
|
+
| `integrate` | 按内置 recipe 修改 Gradle / Manifest / iOS 工程 |
|
|
73
|
+
| `setup` | `fetch-config` + `integrate` |
|
|
74
|
+
|
|
75
|
+
常用参数:`--project-root`、`--dry-run`、`--verbose`、`--patch-file`(integrate 预览 diff)。
|
|
76
|
+
|
|
77
|
+
## 从源码开发
|
|
78
|
+
|
|
79
|
+
源码为内部私有仓库,请向团队获取访问权限后 clone,或在本地直接开发:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
cd meet-sdk-tool
|
|
83
|
+
npm install
|
|
84
|
+
npm run build
|
|
85
|
+
npm test
|
|
86
|
+
|
|
87
|
+
node dist/entry.js doctor --project-root test-projects/android-sample
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## 发布到 npm
|
|
91
|
+
|
|
92
|
+
npm 包名:**`@leonxin/meetgames`**(公开 scope)。`prepack` 会在发布前自动执行 `npm run build`。
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
npm login
|
|
96
|
+
npm test
|
|
97
|
+
npm publish --access public
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## 文档
|
|
101
|
+
|
|
102
|
+
| 文档 | 说明 |
|
|
103
|
+
|------|------|
|
|
104
|
+
| [docs/ANDROID.md](docs/ANDROID.md) | Android 集成与 CLI 参数 |
|
|
105
|
+
| [docs/API.md](docs/API.md) | HTTP 接口索引 |
|
|
106
|
+
| [docs/api/downloadSDKConfig.md](docs/api/downloadSDKConfig.md) | `fetch-config` 使用的接口 |
|
|
107
|
+
| [docs/MCP-SKILL.md](docs/MCP-SKILL.md) | MCP 工具说明 |
|
|
108
|
+
|
|
109
|
+
## npm 包内容说明
|
|
110
|
+
|
|
111
|
+
发布包**不包含**:
|
|
112
|
+
|
|
113
|
+
- `test-projects/`(仅仓库内 Vitest / 联调样例)
|
|
114
|
+
- `bundled/ios-sdk/`(iOS 二进制 SDK 体积大,请从 SDK 下载渠道或源码仓库获取)
|
|
115
|
+
|
|
116
|
+
Android 小型 bundled 资源(`bundled/android/`)与 `meetsdk-android.json`、`recipes/` 会随包分发。
|
|
117
|
+
|
|
118
|
+
## License
|
|
119
|
+
|
|
120
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
bundled-sample
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/android/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAGzF,eAAO,MAAM,sBAAsB,EAAE,sBAKpC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/android/adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,sBAAsB,GAA2B;IAC5D,EAAE,EAAE,SAAS;IACb,MAAM,CAAC,WAAmB;QACxB,OAAO,aAAa,CAAC,WAAW,CAAC,CAAC;IACpC,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AndroidIntegrationDocument } from "../contracts/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Normalizes common API envelopes into the integration document shape.
|
|
4
|
+
* Supported roots: top-level `{ version, steps }`, `{ data: ... }`, `{ config: ... }`, `{ android: ... }` (when it contains steps).
|
|
5
|
+
*/
|
|
6
|
+
export declare function unwrapRemoteIntegrationPayload(body: unknown): unknown;
|
|
7
|
+
export declare function attachIntegrationMeta(doc: AndroidIntegrationDocument, sourceUrl: string, fetchedAt: string): AndroidIntegrationDocument;
|
|
8
|
+
//# sourceMappingURL=assembleIntegrationJson.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assembleIntegrationJson.d.ts","sourceRoot":"","sources":["../../src/android/assembleIntegrationJson.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAMxE;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAOrE;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,0BAA0B,EAC/B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,0BAA0B,CAS5B"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
function isRecord(v) {
|
|
2
|
+
return typeof v === "object" && v !== null;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Normalizes common API envelopes into the integration document shape.
|
|
6
|
+
* Supported roots: top-level `{ version, steps }`, `{ data: ... }`, `{ config: ... }`, `{ android: ... }` (when it contains steps).
|
|
7
|
+
*/
|
|
8
|
+
export function unwrapRemoteIntegrationPayload(body) {
|
|
9
|
+
if (!isRecord(body))
|
|
10
|
+
return body;
|
|
11
|
+
if (Array.isArray(body.steps))
|
|
12
|
+
return body;
|
|
13
|
+
if (isRecord(body.data) && Array.isArray(body.data.steps))
|
|
14
|
+
return body.data;
|
|
15
|
+
if (isRecord(body.config) && Array.isArray(body.config.steps))
|
|
16
|
+
return body.config;
|
|
17
|
+
if (isRecord(body.android) && Array.isArray(body.android.steps))
|
|
18
|
+
return body.android;
|
|
19
|
+
return body;
|
|
20
|
+
}
|
|
21
|
+
export function attachIntegrationMeta(doc, sourceUrl, fetchedAt) {
|
|
22
|
+
return {
|
|
23
|
+
...doc,
|
|
24
|
+
meta: {
|
|
25
|
+
...(doc.meta ?? {}),
|
|
26
|
+
sourceUrl,
|
|
27
|
+
fetchedAt,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=assembleIntegrationJson.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assembleIntegrationJson.js","sourceRoot":"","sources":["../../src/android/assembleIntegrationJson.ts"],"names":[],"mappings":"AAEA,SAAS,QAAQ,CAAC,CAAU;IAC1B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAAC,IAAa;IAC1D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IAC5E,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IAClF,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC;IACrF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,GAA+B,EAC/B,SAAiB,EACjB,SAAiB;IAEjB,OAAO;QACL,GAAG,GAAG;QACN,IAAI,EAAE;YACJ,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;YACnB,SAAS;YACT,SAAS;SACV;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AndroidDetectResult } from "../contracts/types.js";
|
|
2
|
+
export declare function detectAndroid(projectRoot: string): AndroidDetectResult;
|
|
3
|
+
/** Relative path from project root to the detected application module directory (e.g. `app`, `launcher`). */
|
|
4
|
+
export declare function applicationModuleRelPath(projectRoot: string, android: Extract<AndroidDetectResult, {
|
|
5
|
+
ok: true;
|
|
6
|
+
}>): string;
|
|
7
|
+
/** Default `google-services.json` location: `{applicationModule}/google-services.json`. */
|
|
8
|
+
export declare function defaultGoogleServicesJsonRelPath(projectRoot: string, android: Extract<AndroidDetectResult, {
|
|
9
|
+
ok: true;
|
|
10
|
+
}>): string;
|
|
11
|
+
//# sourceMappingURL=detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/android/detect.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAsCjE,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB,CA4CtE;AAED,6GAA6G;AAC7G,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,CAAC,mBAAmB,EAAE;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,CAAC,GAClD,MAAM,CAER;AAED,2FAA2F;AAC3F,wBAAgB,gCAAgC,CAC9C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,CAAC,mBAAmB,EAAE;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,CAAC,GAClD,MAAM,CAGR"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
function parseIncludes(settingsContent) {
|
|
4
|
+
const includes = [];
|
|
5
|
+
const includeRegex = /include\s+([^\n]+)/g;
|
|
6
|
+
let match = includeRegex.exec(settingsContent);
|
|
7
|
+
while (match) {
|
|
8
|
+
const raw = match[1];
|
|
9
|
+
const parts = raw
|
|
10
|
+
.split(",")
|
|
11
|
+
.map((x) => x.trim())
|
|
12
|
+
.filter(Boolean)
|
|
13
|
+
.map((x) => x.replace(/^['"]|['"]$/g, ""));
|
|
14
|
+
includes.push(...parts);
|
|
15
|
+
match = includeRegex.exec(settingsContent);
|
|
16
|
+
}
|
|
17
|
+
return includes;
|
|
18
|
+
}
|
|
19
|
+
function isApplicationModule(buildGradleContent) {
|
|
20
|
+
const applyPlugin = /apply\s+plugin:\s*['"]com\.android\.application['"]/m.test(buildGradleContent);
|
|
21
|
+
const pluginsBlock = /id\s*\(?\s*['"]com\.android\.application['"]\s*\)?/m.test(buildGradleContent);
|
|
22
|
+
const pluginAlias = /\balias\s*\(\s*libs\.plugins\.[A-Za-z0-9_.-]*application[A-Za-z0-9_.-]*\s*\)/m.test(buildGradleContent);
|
|
23
|
+
const hasAndroidBlock = /\bandroid\s*\{/m.test(buildGradleContent);
|
|
24
|
+
const hasApplicationId = /\bapplicationId\s+(?:=+\s*)?["'][^"']+["']/m.test(buildGradleContent);
|
|
25
|
+
return applyPlugin || pluginsBlock || pluginAlias || (hasAndroidBlock && hasApplicationId);
|
|
26
|
+
}
|
|
27
|
+
function moduleNameToDir(projectRoot, moduleName) {
|
|
28
|
+
const normalized = moduleName.startsWith(":") ? moduleName.slice(1) : moduleName;
|
|
29
|
+
const relative = normalized.replace(/:/g, "/");
|
|
30
|
+
return path.join(projectRoot, relative);
|
|
31
|
+
}
|
|
32
|
+
function defaultManifestPath(moduleDir) {
|
|
33
|
+
return path.join(moduleDir, "src", "main", "AndroidManifest.xml");
|
|
34
|
+
}
|
|
35
|
+
export function detectAndroid(projectRoot) {
|
|
36
|
+
const settingsGradle = path.join(projectRoot, "settings.gradle");
|
|
37
|
+
const settingsGradleKts = path.join(projectRoot, "settings.gradle.kts");
|
|
38
|
+
let settingsContent = "";
|
|
39
|
+
if (fs.existsSync(settingsGradle)) {
|
|
40
|
+
settingsContent = fs.readFileSync(settingsGradle, "utf8");
|
|
41
|
+
}
|
|
42
|
+
else if (fs.existsSync(settingsGradleKts)) {
|
|
43
|
+
settingsContent = fs.readFileSync(settingsGradleKts, "utf8");
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
return { ok: false, error: "settings.gradle / settings.gradle.kts not found in project root" };
|
|
47
|
+
}
|
|
48
|
+
const modules = parseIncludes(settingsContent);
|
|
49
|
+
if (!modules.length) {
|
|
50
|
+
return { ok: false, error: "no modules found in settings.gradle" };
|
|
51
|
+
}
|
|
52
|
+
const applicationModules = [];
|
|
53
|
+
for (const moduleName of modules) {
|
|
54
|
+
const moduleDir = moduleNameToDir(projectRoot, moduleName);
|
|
55
|
+
const candidates = [path.join(moduleDir, "build.gradle"), path.join(moduleDir, "build.gradle.kts")];
|
|
56
|
+
const moduleGradle = candidates.find((p) => fs.existsSync(p));
|
|
57
|
+
if (!moduleGradle)
|
|
58
|
+
continue;
|
|
59
|
+
const content = fs.readFileSync(moduleGradle, "utf8");
|
|
60
|
+
if (isApplicationModule(content)) {
|
|
61
|
+
applicationModules.push({ moduleName, moduleDir });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (applicationModules.length === 0) {
|
|
65
|
+
return { ok: false, error: "NO_APPLICATION_MODULE_FOUND" };
|
|
66
|
+
}
|
|
67
|
+
if (applicationModules.length > 1) {
|
|
68
|
+
const list = applicationModules.map((x) => x.moduleName).join(", ");
|
|
69
|
+
return { ok: false, error: `MULTIPLE_APPLICATION_MODULES_FOUND: ${list}` };
|
|
70
|
+
}
|
|
71
|
+
const { moduleName, moduleDir } = applicationModules[0];
|
|
72
|
+
const manifestPath = defaultManifestPath(moduleDir);
|
|
73
|
+
if (!fs.existsSync(manifestPath)) {
|
|
74
|
+
return { ok: false, error: `AndroidManifest.xml not found at ${manifestPath}` };
|
|
75
|
+
}
|
|
76
|
+
return { ok: true, moduleName, moduleDir, manifestPath };
|
|
77
|
+
}
|
|
78
|
+
/** Relative path from project root to the detected application module directory (e.g. `app`, `launcher`). */
|
|
79
|
+
export function applicationModuleRelPath(projectRoot, android) {
|
|
80
|
+
return path.relative(projectRoot, android.moduleDir).split(path.sep).join("/");
|
|
81
|
+
}
|
|
82
|
+
/** Default `google-services.json` location: `{applicationModule}/google-services.json`. */
|
|
83
|
+
export function defaultGoogleServicesJsonRelPath(projectRoot, android) {
|
|
84
|
+
const moduleRel = applicationModuleRelPath(projectRoot, android);
|
|
85
|
+
return moduleRel ? `${moduleRel}/google-services.json` : "google-services.json";
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/android/detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { MeetSdkAnalyticsFirebaseCredentials } from "../config/meetSdkRemoteConfig.js";
|
|
2
|
+
/**
|
|
3
|
+
* Resolve target file under the detected Android application module:
|
|
4
|
+
* `{projectRoot}/{applicationModuleRel}/{fileName}`.
|
|
5
|
+
* `fileName` comes from remote `firebase_file_name` (DB `firebase_name`, upload original name + suffix).
|
|
6
|
+
* Relative path is not configured in MG; meet-sdk-tool detects the app module from `projectRoot`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function resolveGoogleServicesJsonTarget(projectRoot: string, firebase: MeetSdkAnalyticsFirebaseCredentials, applicationModuleRelPath?: string): string;
|
|
9
|
+
export declare function downloadGoogleServicesJson(projectRoot: string, firebase: MeetSdkAnalyticsFirebaseCredentials, options?: {
|
|
10
|
+
applicationModuleRelPath?: string;
|
|
11
|
+
dryRun?: boolean;
|
|
12
|
+
}): Promise<{
|
|
13
|
+
ok: true;
|
|
14
|
+
relPath: string;
|
|
15
|
+
absPath: string;
|
|
16
|
+
} | {
|
|
17
|
+
ok: false;
|
|
18
|
+
error: string;
|
|
19
|
+
}>;
|
|
20
|
+
//# sourceMappingURL=downloadGoogleServicesJson.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"downloadGoogleServicesJson.d.ts","sourceRoot":"","sources":["../../src/android/downloadGoogleServicesJson.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,kCAAkC,CAAC;AAE5F;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC7C,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,mCAAmC,EAC7C,wBAAwB,CAAC,EAAE,MAAM,GAChC,MAAM,CAOR;AAED,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,mCAAmC,EAC7C,OAAO,CAAC,EAAE;IAAE,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAChE,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA4BxF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Resolve target file under the detected Android application module:
|
|
5
|
+
* `{projectRoot}/{applicationModuleRel}/{fileName}`.
|
|
6
|
+
* `fileName` comes from remote `firebase_file_name` (DB `firebase_name`, upload original name + suffix).
|
|
7
|
+
* Relative path is not configured in MG; meet-sdk-tool detects the app module from `projectRoot`.
|
|
8
|
+
*/
|
|
9
|
+
export function resolveGoogleServicesJsonTarget(projectRoot, firebase, applicationModuleRelPath) {
|
|
10
|
+
const fileName = firebase.firebase_file_name?.trim() || "google-services.json";
|
|
11
|
+
const moduleRel = applicationModuleRelPath?.trim().replace(/\\/g, "/").replace(/\/+$/, "");
|
|
12
|
+
if (moduleRel) {
|
|
13
|
+
return path.join(projectRoot, moduleRel, fileName);
|
|
14
|
+
}
|
|
15
|
+
return path.join(projectRoot, fileName);
|
|
16
|
+
}
|
|
17
|
+
export async function downloadGoogleServicesJson(projectRoot, firebase, options) {
|
|
18
|
+
const url = firebase.firebase_file_url?.trim();
|
|
19
|
+
if (!url) {
|
|
20
|
+
return { ok: false, error: "firebase_file_url is empty" };
|
|
21
|
+
}
|
|
22
|
+
const absPath = resolveGoogleServicesJsonTarget(projectRoot, firebase, options?.applicationModuleRelPath);
|
|
23
|
+
const relPath = path.relative(projectRoot, absPath).split(path.sep).join("/");
|
|
24
|
+
if (options?.dryRun) {
|
|
25
|
+
return { ok: true, relPath, absPath };
|
|
26
|
+
}
|
|
27
|
+
let res;
|
|
28
|
+
try {
|
|
29
|
+
res = await fetch(url);
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
33
|
+
return { ok: false, error: `fetch failed: ${msg}` };
|
|
34
|
+
}
|
|
35
|
+
if (!res.ok) {
|
|
36
|
+
return { ok: false, error: `HTTP ${res.status} ${res.statusText}` };
|
|
37
|
+
}
|
|
38
|
+
const buf = Buffer.from(await res.arrayBuffer());
|
|
39
|
+
fs.mkdirSync(path.dirname(absPath), { recursive: true });
|
|
40
|
+
fs.writeFileSync(absPath, buf);
|
|
41
|
+
return { ok: true, relPath, absPath };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=downloadGoogleServicesJson.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"downloadGoogleServicesJson.js","sourceRoot":"","sources":["../../src/android/downloadGoogleServicesJson.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B;;;;;GAKG;AACH,MAAM,UAAU,+BAA+B,CAC7C,WAAmB,EACnB,QAA6C,EAC7C,wBAAiC;IAEjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,kBAAkB,EAAE,IAAI,EAAE,IAAI,sBAAsB,CAAC;IAC/E,MAAM,SAAS,GAAG,wBAAwB,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC3F,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,WAAmB,EACnB,QAA6C,EAC7C,OAAiE;IAEjE,MAAM,GAAG,GAAG,QAAQ,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC/C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;IAC5D,CAAC;IAED,MAAM,OAAO,GAAG,+BAA+B,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,wBAAwB,CAAC,CAAC;IAC1G,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE9E,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IACxC,CAAC;IAED,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,GAAG,EAAE,EAAE,CAAC;IACtD,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;IACtE,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IACjD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC/B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchRemoteConfig.d.ts","sourceRoot":"","sources":["../../src/android/fetchRemoteConfig.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAkB7F"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pull JSON from a remote HTTP(S) endpoint (Node 18+ global fetch).
|
|
3
|
+
*/
|
|
4
|
+
export async function fetchRemoteConfigJson(url, init) {
|
|
5
|
+
const res = await fetch(url, {
|
|
6
|
+
redirect: "follow",
|
|
7
|
+
...init,
|
|
8
|
+
headers: {
|
|
9
|
+
Accept: "application/json",
|
|
10
|
+
...(init?.headers ?? {}),
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
if (!res.ok) {
|
|
14
|
+
throw new Error(`GET ${url} failed: HTTP ${res.status}`);
|
|
15
|
+
}
|
|
16
|
+
const text = await res.text();
|
|
17
|
+
try {
|
|
18
|
+
return JSON.parse(text);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
throw new Error("Remote response is not valid JSON");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=fetchRemoteConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchRemoteConfig.js","sourceRoot":"","sources":["../../src/android/fetchRemoteConfig.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAW,EAAE,IAAkB;IACzE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,QAAQ,EAAE,QAAQ;QAClB,GAAG,IAAI;QACP,OAAO,EAAE;YACP,MAAM,EAAE,kBAAkB;YAC1B,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;SACzB;KACF,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,OAAO,GAAG,iBAAiB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export declare const START_REPO_MARKER = "// >>> MEET_INTEGRATE REPOS START";
|
|
2
|
+
export declare const END_REPO_MARKER = "// >>> MEET_INTEGRATE REPOS END";
|
|
3
|
+
export declare const START_BLOCK_MARKER = "// >>> MEET_INTEGRATE BLOCK START";
|
|
4
|
+
export declare const END_BLOCK_MARKER = "// >>> MEET_INTEGRATE BLOCK END";
|
|
5
|
+
export interface BlockRange {
|
|
6
|
+
start: number;
|
|
7
|
+
openBrace: number;
|
|
8
|
+
end: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function findBlockRange(content: string, keyword: string, searchFrom?: number): BlockRange | null;
|
|
11
|
+
export declare function replaceOrInsertManaged(content: string, blockRange: BlockRange, startMarker: string, endMarker: string, snippet: string): string;
|
|
12
|
+
export declare function updateRootBuildGradleRepositories(content: string, urls: string[]): {
|
|
13
|
+
ok: true;
|
|
14
|
+
content: string;
|
|
15
|
+
changed: boolean;
|
|
16
|
+
warnings: string[];
|
|
17
|
+
} | {
|
|
18
|
+
ok: false;
|
|
19
|
+
error: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function updateModuleBuildGradleDependencies(content: string, dependencyLines: string[]): {
|
|
22
|
+
ok: true;
|
|
23
|
+
content: string;
|
|
24
|
+
changed: boolean;
|
|
25
|
+
warnings: string[];
|
|
26
|
+
} | {
|
|
27
|
+
ok: false;
|
|
28
|
+
error: string;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=gradle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradle.d.ts","sourceRoot":"","sources":["../../src/android/gradle.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,sCAAsC,CAAC;AACrE,eAAO,MAAM,eAAe,oCAAoC,CAAC;AACjE,eAAO,MAAM,kBAAkB,sCAAsC,CAAC;AACtE,eAAO,MAAM,gBAAgB,oCAAoC,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,SAAI,GAAG,UAAU,GAAG,IAAI,CAmBlG;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,MAAM,CAeR;AAaD,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,GACb;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAqBpG;AAMD,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,EAAE,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAgBpG"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
export const START_REPO_MARKER = "// >>> MEET_INTEGRATE REPOS START";
|
|
2
|
+
export const END_REPO_MARKER = "// >>> MEET_INTEGRATE REPOS END";
|
|
3
|
+
export const START_BLOCK_MARKER = "// >>> MEET_INTEGRATE BLOCK START";
|
|
4
|
+
export const END_BLOCK_MARKER = "// >>> MEET_INTEGRATE BLOCK END";
|
|
5
|
+
export function findBlockRange(content, keyword, searchFrom = 0) {
|
|
6
|
+
// Require `keyword {` so `com.android.application` / `androidx` are not matched.
|
|
7
|
+
const re = new RegExp(`\\b${keyword}\\s*\\{`);
|
|
8
|
+
const slice = content.slice(searchFrom);
|
|
9
|
+
const match = re.exec(slice);
|
|
10
|
+
if (!match || match.index === undefined)
|
|
11
|
+
return null;
|
|
12
|
+
const keywordIndex = searchFrom + match.index;
|
|
13
|
+
const openBrace = content.indexOf("{", keywordIndex + match[0].length - 1);
|
|
14
|
+
if (openBrace < 0)
|
|
15
|
+
return null;
|
|
16
|
+
let depth = 0;
|
|
17
|
+
for (let i = openBrace; i < content.length; i += 1) {
|
|
18
|
+
const ch = content[i];
|
|
19
|
+
if (ch === "{")
|
|
20
|
+
depth += 1;
|
|
21
|
+
if (ch === "}") {
|
|
22
|
+
depth -= 1;
|
|
23
|
+
if (depth === 0)
|
|
24
|
+
return { start: keywordIndex, openBrace, end: i };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
export function replaceOrInsertManaged(content, blockRange, startMarker, endMarker, snippet) {
|
|
30
|
+
const blockText = content.slice(blockRange.openBrace + 1, blockRange.end);
|
|
31
|
+
const startInBlock = blockText.indexOf(startMarker);
|
|
32
|
+
const endInBlock = blockText.indexOf(endMarker);
|
|
33
|
+
const insertion = `${snippet}\n`;
|
|
34
|
+
if (startInBlock >= 0 && endInBlock > startInBlock) {
|
|
35
|
+
const before = blockText.slice(0, startInBlock).replace(/\s*$/, "\n");
|
|
36
|
+
const after = blockText.slice(endInBlock + endMarker.length).replace(/^\s*/, "\n");
|
|
37
|
+
const replaced = `${before}${snippet}${after}`;
|
|
38
|
+
return content.slice(0, blockRange.openBrace + 1) + replaced + content.slice(blockRange.end);
|
|
39
|
+
}
|
|
40
|
+
const prefix = content.slice(0, blockRange.end);
|
|
41
|
+
return prefix + insertion.trimEnd() + "\n" + content.slice(blockRange.end);
|
|
42
|
+
}
|
|
43
|
+
function buildRepoSnippet(urls) {
|
|
44
|
+
const lines = [START_REPO_MARKER];
|
|
45
|
+
for (const url of urls) {
|
|
46
|
+
if (url === "google")
|
|
47
|
+
lines.push(" google()");
|
|
48
|
+
else if (url === "mavenCentral")
|
|
49
|
+
lines.push(" mavenCentral()");
|
|
50
|
+
else
|
|
51
|
+
lines.push(` maven { url '${url}' }`);
|
|
52
|
+
}
|
|
53
|
+
lines.push(END_REPO_MARKER);
|
|
54
|
+
return lines.join("\n");
|
|
55
|
+
}
|
|
56
|
+
export function updateRootBuildGradleRepositories(content, urls) {
|
|
57
|
+
const warnings = [];
|
|
58
|
+
const allprojects = findBlockRange(content, "allprojects");
|
|
59
|
+
if (!allprojects) {
|
|
60
|
+
return { ok: false, error: "allprojects block not found in root build.gradle" };
|
|
61
|
+
}
|
|
62
|
+
const repositoriesBlock = findBlockRange(content, "repositories", allprojects.start);
|
|
63
|
+
if (!repositoriesBlock || repositoriesBlock.end > allprojects.end) {
|
|
64
|
+
return { ok: false, error: "repositories block under allprojects not found" };
|
|
65
|
+
}
|
|
66
|
+
const snippet = buildRepoSnippet(urls || []);
|
|
67
|
+
const updated = replaceOrInsertManaged(content, repositoriesBlock, START_REPO_MARKER, END_REPO_MARKER, snippet);
|
|
68
|
+
if (updated === content)
|
|
69
|
+
warnings.push("root build.gradle repositories unchanged");
|
|
70
|
+
return { ok: true, content: updated, changed: updated !== content, warnings };
|
|
71
|
+
}
|
|
72
|
+
function buildDependenciesSnippet(lines) {
|
|
73
|
+
return [START_BLOCK_MARKER, ...lines, END_BLOCK_MARKER].join("\n");
|
|
74
|
+
}
|
|
75
|
+
export function updateModuleBuildGradleDependencies(content, dependencyLines) {
|
|
76
|
+
const warnings = [];
|
|
77
|
+
const dependenciesBlock = findBlockRange(content, "dependencies");
|
|
78
|
+
if (!dependenciesBlock) {
|
|
79
|
+
return { ok: false, error: "dependencies block not found in module build.gradle" };
|
|
80
|
+
}
|
|
81
|
+
const snippet = buildDependenciesSnippet(dependencyLines);
|
|
82
|
+
const updated = replaceOrInsertManaged(content, dependenciesBlock, START_BLOCK_MARKER, END_BLOCK_MARKER, snippet);
|
|
83
|
+
if (updated === content)
|
|
84
|
+
warnings.push("module build.gradle dependencies unchanged");
|
|
85
|
+
return { ok: true, content: updated, changed: updated !== content, warnings };
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=gradle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradle.js","sourceRoot":"","sources":["../../src/android/gradle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const MANIFEST_PERM_START = "<!-- MEET_INTEGRATE PERMISSIONS START -->";
|
|
2
|
+
export declare const MANIFEST_PERM_END = "<!-- MEET_INTEGRATE PERMISSIONS END -->";
|
|
3
|
+
export declare function extractPermissionName(line: string): string | null;
|
|
4
|
+
/** Remove <uses-permission> lines for the same android:name (inside or outside managed block). */
|
|
5
|
+
export declare function removePermissionLinesByNames(content: string, names: ReadonlySet<string>): string;
|
|
6
|
+
export declare function insertPermissions(content: string, permissions: string[]): {
|
|
7
|
+
content: string;
|
|
8
|
+
changed: boolean;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/android/manifest.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,8CAA8C,CAAC;AAC/E,eAAO,MAAM,iBAAiB,4CAA4C,CAAC;AAI3E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIjE;AAED,kGAAkG;AAClG,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,CAQhG;AAWD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAkB/G"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export const MANIFEST_PERM_START = "<!-- MEET_INTEGRATE PERMISSIONS START -->";
|
|
2
|
+
export const MANIFEST_PERM_END = "<!-- MEET_INTEGRATE PERMISSIONS END -->";
|
|
3
|
+
const PERMISSION_NAME_RE = /android:name="([^"]+)"/;
|
|
4
|
+
export function extractPermissionName(line) {
|
|
5
|
+
if (!line.includes("uses-permission"))
|
|
6
|
+
return null;
|
|
7
|
+
const m = line.match(PERMISSION_NAME_RE);
|
|
8
|
+
return m?.[1] ?? null;
|
|
9
|
+
}
|
|
10
|
+
/** Remove <uses-permission> lines for the same android:name (inside or outside managed block). */
|
|
11
|
+
export function removePermissionLinesByNames(content, names) {
|
|
12
|
+
return content
|
|
13
|
+
.split("\n")
|
|
14
|
+
.filter((line) => {
|
|
15
|
+
const name = extractPermissionName(line);
|
|
16
|
+
return !name || !names.has(name);
|
|
17
|
+
})
|
|
18
|
+
.join("\n");
|
|
19
|
+
}
|
|
20
|
+
function stripPermissionManagedBlock(content) {
|
|
21
|
+
const start = content.indexOf(MANIFEST_PERM_START);
|
|
22
|
+
const end = content.indexOf(MANIFEST_PERM_END);
|
|
23
|
+
if (start >= 0 && end > start) {
|
|
24
|
+
return content.slice(0, start) + content.slice(end + MANIFEST_PERM_END.length);
|
|
25
|
+
}
|
|
26
|
+
return content;
|
|
27
|
+
}
|
|
28
|
+
export function insertPermissions(content, permissions) {
|
|
29
|
+
const names = new Set(permissions);
|
|
30
|
+
let cleaned = removePermissionLinesByNames(content, names);
|
|
31
|
+
cleaned = stripPermissionManagedBlock(cleaned);
|
|
32
|
+
const lines = [
|
|
33
|
+
MANIFEST_PERM_START,
|
|
34
|
+
...permissions.map((p) => ` <uses-permission android:name="${p}" />`),
|
|
35
|
+
MANIFEST_PERM_END,
|
|
36
|
+
].join("\n");
|
|
37
|
+
const closeManifest = cleaned.lastIndexOf("</manifest>");
|
|
38
|
+
if (closeManifest < 0) {
|
|
39
|
+
return { content, changed: false };
|
|
40
|
+
}
|
|
41
|
+
const insert = `\n${lines}\n`;
|
|
42
|
+
const updated = cleaned.slice(0, closeManifest) + insert + cleaned.slice(closeManifest);
|
|
43
|
+
return { content: updated, changed: updated !== content };
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/android/manifest.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,2CAA2C,CAAC;AAC/E,MAAM,CAAC,MAAM,iBAAiB,GAAG,yCAAyC,CAAC;AAE3E,MAAM,kBAAkB,GAAG,wBAAwB,CAAC;AAEpD,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACxB,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,4BAA4B,CAAC,OAAe,EAAE,KAA0B;IACtF,OAAO,OAAO;SACX,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,2BAA2B,CAAC,OAAe;IAClD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/C,IAAI,KAAK,IAAI,CAAC,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,WAAqB;IACtE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IACnC,IAAI,OAAO,GAAG,4BAA4B,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3D,OAAO,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAE/C,MAAM,KAAK,GAAG;QACZ,mBAAmB;QACnB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sCAAsC,CAAC,MAAM,CAAC;QACxE,iBAAiB;KAClB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IACzD,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,KAAK,IAAI,CAAC;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACxF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,EAAE,CAAC;AAC5D,CAAC"}
|