@deploid/cli 2.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/README.md +180 -0
- package/bin/deploid +2 -0
- package/dist/__tests__/cli.test.d.ts +2 -0
- package/dist/__tests__/cli.test.d.ts.map +1 -0
- package/dist/__tests__/cli.test.js +48 -0
- package/dist/__tests__/cli.test.js.map +1 -0
- package/dist/firebase.d.ts +6 -0
- package/dist/firebase.d.ts.map +1 -0
- package/dist/firebase.js +152 -0
- package/dist/firebase.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +182 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +10 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +470 -0
- package/dist/init.js.map +1 -0
- package/dist/plugin-manager.d.ts +7 -0
- package/dist/plugin-manager.d.ts.map +1 -0
- package/dist/plugin-manager.js +262 -0
- package/dist/plugin-manager.js.map +1 -0
- package/package.json +60 -0
package/README.md
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# Deploid
|
|
2
|
+
|
|
3
|
+
**From build to publish — one command.**
|
|
4
|
+
|
|
5
|
+
Deploid automates the entire process of turning a web app into a ready-to-ship Android package.
|
|
6
|
+
|
|
7
|
+
## 🚀 Quick Start
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Install globally
|
|
11
|
+
npm install -g @deploid/cli
|
|
12
|
+
|
|
13
|
+
# Initialize a project
|
|
14
|
+
deploid init
|
|
15
|
+
|
|
16
|
+
# Add your logo
|
|
17
|
+
cp your-logo.svg assets/logo.svg
|
|
18
|
+
|
|
19
|
+
# Generate all required assets
|
|
20
|
+
deploid assets
|
|
21
|
+
|
|
22
|
+
# Package for Android
|
|
23
|
+
deploid package
|
|
24
|
+
|
|
25
|
+
# Build APK/AAB
|
|
26
|
+
deploid build
|
|
27
|
+
|
|
28
|
+
# Deploy to connected device
|
|
29
|
+
deploid deploy
|
|
30
|
+
|
|
31
|
+
# Setup Firebase for push notifications
|
|
32
|
+
deploid firebase
|
|
33
|
+
|
|
34
|
+
# Manage plugins
|
|
35
|
+
deploid plugin --list
|
|
36
|
+
deploid plugin --install storage
|
|
37
|
+
deploid plugin --remove debug-network
|
|
38
|
+
|
|
39
|
+
# Publish to stores
|
|
40
|
+
deploid publish
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## ✨ Features
|
|
44
|
+
|
|
45
|
+
- **🖼️ Asset Generation**: Automatic icon generation for all Android densities and PWA
|
|
46
|
+
- **📦 Multi-Engine Packaging**: Capacitor, Tauri, and TWA support
|
|
47
|
+
- **🔨 Build System**: APK/AAB generation with signing
|
|
48
|
+
- **☁️ Publishing**: Play Store and GitHub Releases integration
|
|
49
|
+
- **🔧 Plugin Architecture**: Extensible and modular design
|
|
50
|
+
- **💾 Cross-Platform Storage**: Seamless storage across web and native environments
|
|
51
|
+
- **🔥 Firebase Integration**: Automated push notification setup
|
|
52
|
+
- **📱 Native Deployment**: Direct APK installation to devices
|
|
53
|
+
- **🍎 iOS Preparation**: Generate Xcode projects for Mac handoff
|
|
54
|
+
|
|
55
|
+
## 💾 Cross-Platform Storage
|
|
56
|
+
|
|
57
|
+
Deploid includes built-in cross-platform storage utilities that work seamlessly across web and native environments:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# Install storage plugin during init
|
|
61
|
+
deploid init
|
|
62
|
+
# Select "Cross-platform storage utilities" when prompted
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Usage
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
import { crossPlatformStorage } from './lib/storage'
|
|
69
|
+
import { secureStorageUtil } from './lib/secureStorage'
|
|
70
|
+
|
|
71
|
+
// Store data
|
|
72
|
+
await crossPlatformStorage.set('theme', 'dark')
|
|
73
|
+
await secureStorageUtil.set('authToken', 'secret-token')
|
|
74
|
+
|
|
75
|
+
// Retrieve data
|
|
76
|
+
const theme = await crossPlatformStorage.get('theme')
|
|
77
|
+
const token = await secureStorageUtil.get('authToken')
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Features:**
|
|
81
|
+
- 🌐 **Web**: Uses localStorage/sessionStorage
|
|
82
|
+
- 📱 **Native**: Uses Capacitor Preferences + Secure Storage
|
|
83
|
+
- 🔒 **Security**: Encrypted storage for sensitive data
|
|
84
|
+
- 🔄 **Migration**: Easy transition from existing localStorage
|
|
85
|
+
|
|
86
|
+
## 🔧 Plugin Management
|
|
87
|
+
|
|
88
|
+
Deploid includes a powerful plugin system that you can manage after initialization:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# List all available plugins
|
|
92
|
+
deploid plugin --list
|
|
93
|
+
|
|
94
|
+
# Install a specific plugin
|
|
95
|
+
deploid plugin --install storage
|
|
96
|
+
deploid plugin --install debug-network
|
|
97
|
+
|
|
98
|
+
# Remove a plugin
|
|
99
|
+
deploid plugin --remove debug-network
|
|
100
|
+
|
|
101
|
+
# Interactive plugin manager
|
|
102
|
+
deploid plugin
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Available Plugins
|
|
106
|
+
|
|
107
|
+
- **📦 Assets** - Generate app icons and assets (required)
|
|
108
|
+
- **📱 Packaging** - Capacitor, Tauri, TWA support (required for packaging)
|
|
109
|
+
- **🔨 Build** - Android APK/AAB generation
|
|
110
|
+
- **📲 Deploy** - Direct device deployment via ADB
|
|
111
|
+
- **🍎 iOS** - iOS project preparation for Mac handoff
|
|
112
|
+
- **🐛 Debug** - Network debugging tools
|
|
113
|
+
- **💾 Storage** - Cross-platform storage utilities
|
|
114
|
+
|
|
115
|
+
## 🎯 Supported Frameworks
|
|
116
|
+
|
|
117
|
+
- **Vite** (React, Vue, Svelte)
|
|
118
|
+
- **Next.js** (Static export)
|
|
119
|
+
- **Create React App**
|
|
120
|
+
- **Static HTML** projects
|
|
121
|
+
|
|
122
|
+
## 📦 Supported Packaging Engines
|
|
123
|
+
|
|
124
|
+
- **Capacitor** - Native WebView wrapper
|
|
125
|
+
- **Tauri** - Rust-based desktop/mobile (planned)
|
|
126
|
+
- **TWA** - Trusted Web Activity (planned)
|
|
127
|
+
|
|
128
|
+
## 🧩 Commands
|
|
129
|
+
|
|
130
|
+
| Command | Description |
|
|
131
|
+
| -------------------- | ------------------------------------------- |
|
|
132
|
+
| `deploid init` | Setup config and base folders |
|
|
133
|
+
| `deploid assets` | Generate all required icons and screenshots |
|
|
134
|
+
| `deploid package` | Wrap app for Android (Capacitor/Tauri/TWA) |
|
|
135
|
+
| `deploid build` | Build APK/AAB (debug/release) |
|
|
136
|
+
| `deploid publish` | Upload build to Play Store or GitHub |
|
|
137
|
+
|
|
138
|
+
## 📚 Documentation
|
|
139
|
+
|
|
140
|
+
- [Getting Started](docs/getting-started.md)
|
|
141
|
+
- [Configuration](docs/configuration.md)
|
|
142
|
+
- [CLI Reference](docs/cli-reference.md)
|
|
143
|
+
- [Examples](docs/examples.md)
|
|
144
|
+
- [Contributing](docs/contributing.md)
|
|
145
|
+
|
|
146
|
+
## 🎯 Current Status
|
|
147
|
+
|
|
148
|
+
✅ **Milestone 1 — Core CLI + Capacitor** (Complete)
|
|
149
|
+
- [x] Config loader + basic CLI
|
|
150
|
+
- [x] Assets (icons) generation with Sharp
|
|
151
|
+
- [x] Capacitor packaging
|
|
152
|
+
- [x] Debug APK build system
|
|
153
|
+
|
|
154
|
+
🔄 **Next: Milestone 2 — Release + CI**
|
|
155
|
+
- [ ] Signing + release builds
|
|
156
|
+
- [ ] Play/GitHub publishing
|
|
157
|
+
- [ ] Auto GitHub Actions generator
|
|
158
|
+
|
|
159
|
+
## 🧠 Vision
|
|
160
|
+
|
|
161
|
+
> "Turn any web app into a publishable Android app with one command — including icons, signing, builds, and release automation."
|
|
162
|
+
|
|
163
|
+
The long-term goal: Expand to **multi-platform** (Windows .exe, macOS DMG, iOS IPA, and Web Deploy).
|
|
164
|
+
|
|
165
|
+
## 📄 License
|
|
166
|
+
|
|
167
|
+
MIT © [MadsenDev](https://github.com/MadsenDev)
|
|
168
|
+
|
|
169
|
+
## 🤝 Contributing
|
|
170
|
+
|
|
171
|
+
Contributions are welcome! Please see our [Contributing Guide](docs/contributing.md) for details.
|
|
172
|
+
|
|
173
|
+
## 📞 Support
|
|
174
|
+
|
|
175
|
+
- **GitHub Issues**: [Report bugs and request features](https://github.com/MadsenDev/deploid/issues)
|
|
176
|
+
- **GitHub Discussions**: [Ask questions and discuss](https://github.com/MadsenDev/deploid/discussions)
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
**Made with ❤️ by [MadsenDev](https://github.com/MadsenDev)**
|
package/bin/deploid
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/cli.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { execa } from 'execa';
|
|
3
|
+
import fs from 'node:fs/promises';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
describe('Deploid CLI', () => {
|
|
7
|
+
const cliEntry = path.resolve('dist/index.js');
|
|
8
|
+
it('should show help when run without arguments', async () => {
|
|
9
|
+
const { stdout } = await execa('node', [cliEntry, '--help']);
|
|
10
|
+
expect(stdout).toContain('Build -> package -> sign -> publish web apps to Android');
|
|
11
|
+
});
|
|
12
|
+
it('should show version', async () => {
|
|
13
|
+
const { stdout } = await execa('node', [cliEntry, '--version']);
|
|
14
|
+
expect(stdout).toContain('2.0.0');
|
|
15
|
+
});
|
|
16
|
+
it('should list available commands', async () => {
|
|
17
|
+
const { stdout } = await execa('node', [cliEntry, '--help']);
|
|
18
|
+
expect(stdout).toContain('init');
|
|
19
|
+
expect(stdout).toContain('assets');
|
|
20
|
+
expect(stdout).toContain('package');
|
|
21
|
+
expect(stdout).toContain('build');
|
|
22
|
+
expect(stdout).toContain('deploy');
|
|
23
|
+
expect(stdout).toContain('firebase');
|
|
24
|
+
});
|
|
25
|
+
it('should fail fast for publish in 2.0', async () => {
|
|
26
|
+
const { stderr, exitCode } = await execa('node', [cliEntry, 'publish'], {
|
|
27
|
+
reject: false
|
|
28
|
+
});
|
|
29
|
+
expect(exitCode).not.toBe(0);
|
|
30
|
+
expect(stderr).toContain('not implemented');
|
|
31
|
+
});
|
|
32
|
+
it('should reject non-capacitor packaging in 2.0', async () => {
|
|
33
|
+
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'deploid-test-'));
|
|
34
|
+
await fs.writeFile(path.join(tmpDir, 'deploid.config.mjs'), `export default {
|
|
35
|
+
appName: 'TestApp',
|
|
36
|
+
appId: 'com.example.testapp',
|
|
37
|
+
web: { framework: 'vite', buildCommand: 'npm run build', webDir: 'dist' },
|
|
38
|
+
android: { packaging: 'tauri' }
|
|
39
|
+
};\n`);
|
|
40
|
+
const { stderr, exitCode } = await execa('node', [cliEntry, 'package'], {
|
|
41
|
+
cwd: tmpDir,
|
|
42
|
+
reject: false
|
|
43
|
+
});
|
|
44
|
+
expect(exitCode).not.toBe(0);
|
|
45
|
+
expect(stderr).toContain('not supported in Deploid 2.0');
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=cli.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../src/__tests__/cli.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firebase.d.ts","sourceRoot":"","sources":["../src/firebase.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAwG3E"}
|
package/dist/firebase.js
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { execa } from 'execa';
|
|
4
|
+
import readline from 'node:readline';
|
|
5
|
+
export async function setupFirebase(options) {
|
|
6
|
+
const cwd = process.cwd();
|
|
7
|
+
console.log('🔥 Firebase Setup for Push Notifications');
|
|
8
|
+
console.log('This will configure Firebase for native Android push notifications.\n');
|
|
9
|
+
try {
|
|
10
|
+
// Check if Firebase CLI is installed
|
|
11
|
+
try {
|
|
12
|
+
await execa('firebase', ['--version'], { stdio: 'pipe' });
|
|
13
|
+
console.log('✅ Firebase CLI found');
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
console.log('📦 Installing Firebase CLI...');
|
|
17
|
+
await execa('npm', ['install', '-g', 'firebase-tools'], { stdio: 'inherit' });
|
|
18
|
+
}
|
|
19
|
+
// Login to Firebase
|
|
20
|
+
console.log('🔐 Please login to Firebase...');
|
|
21
|
+
await execa('firebase', ['login'], { stdio: 'inherit' });
|
|
22
|
+
let projectId = options.projectId;
|
|
23
|
+
// Create or select Firebase project
|
|
24
|
+
if (options.autoCreate || !projectId) {
|
|
25
|
+
if (options.autoCreate) {
|
|
26
|
+
console.log('🚀 Creating new Firebase project...');
|
|
27
|
+
const projectName = path.basename(cwd).replace(/[^a-zA-Z0-9]/g, '-');
|
|
28
|
+
await execa('firebase', ['projects:create', projectName], { stdio: 'inherit' });
|
|
29
|
+
projectId = projectName;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
// List existing projects
|
|
33
|
+
console.log('📋 Available Firebase projects:');
|
|
34
|
+
const { stdout } = await execa('firebase', ['projects:list'], { stdio: 'pipe' });
|
|
35
|
+
console.log(stdout);
|
|
36
|
+
const rl = readline.createInterface({
|
|
37
|
+
input: process.stdin,
|
|
38
|
+
output: process.stdout
|
|
39
|
+
});
|
|
40
|
+
projectId = await new Promise((resolve) => {
|
|
41
|
+
rl.question('Enter project ID: ', resolve);
|
|
42
|
+
});
|
|
43
|
+
rl.close();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Initialize Firebase in the project
|
|
47
|
+
console.log('🔧 Initializing Firebase in project...');
|
|
48
|
+
await execa('firebase', ['use', projectId], { cwd, stdio: 'inherit' });
|
|
49
|
+
// Add Android app to Firebase
|
|
50
|
+
console.log('📱 Adding Android app to Firebase...');
|
|
51
|
+
const packageName = await getPackageName(cwd);
|
|
52
|
+
await execa('firebase', ['apps:create', 'android', packageName], {
|
|
53
|
+
cwd,
|
|
54
|
+
stdio: 'inherit'
|
|
55
|
+
});
|
|
56
|
+
// Download google-services.json
|
|
57
|
+
console.log('📄 Downloading google-services.json...');
|
|
58
|
+
await execa('firebase', ['apps:sdkconfig', 'android'], {
|
|
59
|
+
cwd,
|
|
60
|
+
stdio: 'inherit'
|
|
61
|
+
});
|
|
62
|
+
// Move google-services.json to correct location
|
|
63
|
+
const sourcePath = path.join(cwd, 'google-services.json');
|
|
64
|
+
const targetPath = path.join(cwd, 'android/app/google-services.json');
|
|
65
|
+
if (fs.existsSync(sourcePath)) {
|
|
66
|
+
// Ensure android/app directory exists
|
|
67
|
+
const androidAppDir = path.dirname(targetPath);
|
|
68
|
+
if (!fs.existsSync(androidAppDir)) {
|
|
69
|
+
fs.mkdirSync(androidAppDir, { recursive: true });
|
|
70
|
+
}
|
|
71
|
+
fs.copyFileSync(sourcePath, targetPath);
|
|
72
|
+
fs.unlinkSync(sourcePath); // Remove from root
|
|
73
|
+
console.log('✅ google-services.json placed in android/app/');
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.log('⚠️ google-services.json not found. Please download it manually from Firebase Console.');
|
|
77
|
+
console.log('Place it in: android/app/google-services.json');
|
|
78
|
+
}
|
|
79
|
+
// Update Android build.gradle if needed
|
|
80
|
+
await updateAndroidBuildGradle(cwd);
|
|
81
|
+
console.log('\n🎉 Firebase setup complete!');
|
|
82
|
+
console.log('Your app now supports native push notifications.');
|
|
83
|
+
console.log('\nNext steps:');
|
|
84
|
+
console.log(' 1. Run: deploid build');
|
|
85
|
+
console.log(' 2. Run: deploid deploy');
|
|
86
|
+
console.log(' 3. Test push notifications in your app');
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
console.log('❌ Firebase setup failed:', error);
|
|
90
|
+
console.log('\nManual setup:');
|
|
91
|
+
console.log(' 1. Go to https://console.firebase.google.com/');
|
|
92
|
+
console.log(' 2. Create a new project');
|
|
93
|
+
console.log(' 3. Add Android app with package name:', await getPackageName(cwd));
|
|
94
|
+
console.log(' 4. Download google-services.json to android/app/');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async function getPackageName(cwd) {
|
|
98
|
+
try {
|
|
99
|
+
// Try to read from android/app/build.gradle
|
|
100
|
+
const buildGradlePath = path.join(cwd, 'android/app/build.gradle');
|
|
101
|
+
if (fs.existsSync(buildGradlePath)) {
|
|
102
|
+
const content = fs.readFileSync(buildGradlePath, 'utf8');
|
|
103
|
+
const match = content.match(/applicationId\s+['"]([^'"]+)['"]/);
|
|
104
|
+
if (match) {
|
|
105
|
+
return match[1];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Try to read from deploid.config.ts
|
|
109
|
+
const configPath = path.join(cwd, 'deploid.config.ts');
|
|
110
|
+
if (fs.existsSync(configPath)) {
|
|
111
|
+
const content = fs.readFileSync(configPath, 'utf8');
|
|
112
|
+
const match = content.match(/appId:\s+['"]([^'"]+)['"]/);
|
|
113
|
+
if (match) {
|
|
114
|
+
return match[1];
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Default fallback
|
|
118
|
+
return 'com.example.myapp';
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
return 'com.example.myapp';
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async function updateAndroidBuildGradle(cwd) {
|
|
125
|
+
const buildGradlePath = path.join(cwd, 'android/app/build.gradle');
|
|
126
|
+
if (!fs.existsSync(buildGradlePath)) {
|
|
127
|
+
console.log('⚠️ android/app/build.gradle not found. Skipping build.gradle updates.');
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
let content = fs.readFileSync(buildGradlePath, 'utf8');
|
|
131
|
+
// Check if Google Services plugin is already applied
|
|
132
|
+
if (!content.includes('com.google.gms.google-services')) {
|
|
133
|
+
console.log('🔧 Adding Google Services plugin to build.gradle...');
|
|
134
|
+
// Add plugin application
|
|
135
|
+
content = content.replace(/apply plugin: 'com\.android\.application'/, "apply plugin: 'com.android.application'\napply plugin: 'com.google.gms.google-services'");
|
|
136
|
+
// Add Firebase dependencies if not present
|
|
137
|
+
if (!content.includes('firebase-messaging')) {
|
|
138
|
+
const dependenciesMatch = content.match(/(dependencies\s*\{[^}]*\})/s);
|
|
139
|
+
if (dependenciesMatch) {
|
|
140
|
+
const dependencies = dependenciesMatch[1];
|
|
141
|
+
const newDependencies = dependencies.replace(/(implementation project\(':capacitor-android'\))/, '$1\n \n // Firebase dependencies\n implementation \'com.google.firebase:firebase-messaging:23.4.1\'\n implementation \'com.google.firebase:firebase-analytics:21.5.1\'');
|
|
142
|
+
content = content.replace(dependencies, newDependencies);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
fs.writeFileSync(buildGradlePath, content);
|
|
146
|
+
console.log('✅ Updated android/app/build.gradle');
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
console.log('✅ Google Services plugin already configured');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=firebase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firebase.js","sourceRoot":"","sources":["../src/firebase.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { createContext, loadConfig, runPipeline, loadPlugin } from '@deploid/core';
|
|
4
|
+
import { readFileSync } from 'node:fs';
|
|
5
|
+
import { join, dirname } from 'node:path';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
// Get version from package.json
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = dirname(__filename);
|
|
10
|
+
const packageJson = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf8'));
|
|
11
|
+
const program = new Command();
|
|
12
|
+
program
|
|
13
|
+
.name('deploid')
|
|
14
|
+
.description('Build -> package -> sign -> publish web apps to Android')
|
|
15
|
+
.version(packageJson.version);
|
|
16
|
+
program
|
|
17
|
+
.command('init')
|
|
18
|
+
.description('Setup config and base folders')
|
|
19
|
+
.option('-f, --framework <framework>', 'Web framework (vite|next|cra|static)', 'vite')
|
|
20
|
+
.option('-p, --packaging <engine>', 'Android packaging engine (capacitor|tauri|twa)', 'capacitor')
|
|
21
|
+
.option('--all-plugins', 'Install all available plugins without prompts')
|
|
22
|
+
.option('--debug', 'Enable debug logging')
|
|
23
|
+
.action(async (options) => {
|
|
24
|
+
const { initProject } = await import('./init.js');
|
|
25
|
+
await initProject(options);
|
|
26
|
+
});
|
|
27
|
+
program
|
|
28
|
+
.command('assets')
|
|
29
|
+
.description('Generate icons and screenshots')
|
|
30
|
+
.option('--debug', 'Enable debug logging')
|
|
31
|
+
.action(async (options) => {
|
|
32
|
+
const config = await loadConfig();
|
|
33
|
+
const ctx = createContext(process.cwd(), config, options.debug);
|
|
34
|
+
const assetsStep = await loadPlugin('assets', config);
|
|
35
|
+
await runPipeline(ctx, [assetsStep]);
|
|
36
|
+
});
|
|
37
|
+
program
|
|
38
|
+
.command('package')
|
|
39
|
+
.description('Wrap app for Android (Capacitor/Tauri/TWA)')
|
|
40
|
+
.option('--debug', 'Enable debug logging')
|
|
41
|
+
.action(async (options) => {
|
|
42
|
+
const config = await loadConfig();
|
|
43
|
+
if (config.android.packaging !== 'capacitor') {
|
|
44
|
+
throw new Error(`Packaging engine "${config.android.packaging}" is not supported in Deploid 2.0. Use "capacitor".`);
|
|
45
|
+
}
|
|
46
|
+
const ctx = createContext(process.cwd(), config, options.debug);
|
|
47
|
+
const packagingStep = await loadPlugin(`packaging-${config.android.packaging}`, config);
|
|
48
|
+
await runPipeline(ctx, [packagingStep]);
|
|
49
|
+
});
|
|
50
|
+
program
|
|
51
|
+
.command('build')
|
|
52
|
+
.description('Build APK/AAB')
|
|
53
|
+
.option('--debug', 'Enable debug logging')
|
|
54
|
+
.action(async (options) => {
|
|
55
|
+
const config = await loadConfig();
|
|
56
|
+
const ctx = createContext(process.cwd(), config, options.debug);
|
|
57
|
+
const buildStep = await loadPlugin('build-android', config);
|
|
58
|
+
await runPipeline(ctx, [buildStep]);
|
|
59
|
+
});
|
|
60
|
+
program
|
|
61
|
+
.command('debug')
|
|
62
|
+
.description('Add network debugging tools to your project')
|
|
63
|
+
.action(async () => {
|
|
64
|
+
const config = await loadConfig();
|
|
65
|
+
const ctx = createContext(process.cwd(), config);
|
|
66
|
+
const debugStep = await loadPlugin('debug-network', config);
|
|
67
|
+
await runPipeline(ctx, [debugStep]);
|
|
68
|
+
});
|
|
69
|
+
program
|
|
70
|
+
.command('deploy')
|
|
71
|
+
.description('Deploy APK to connected Android devices')
|
|
72
|
+
.option('-f, --force', 'Force install (overwrite existing app)')
|
|
73
|
+
.option('-l, --launch', 'Launch app after installation')
|
|
74
|
+
.option('--debug', 'Enable debug logging')
|
|
75
|
+
.action(async (options) => {
|
|
76
|
+
const config = await loadConfig();
|
|
77
|
+
const ctx = createContext(process.cwd(), config, options.debug);
|
|
78
|
+
const deployStep = await loadPlugin('deploy-android', config);
|
|
79
|
+
await runPipeline(ctx, [deployStep]);
|
|
80
|
+
});
|
|
81
|
+
program
|
|
82
|
+
.command('devices')
|
|
83
|
+
.description('List connected Android devices')
|
|
84
|
+
.option('--debug', 'Enable debug logging')
|
|
85
|
+
.action(async (options) => {
|
|
86
|
+
const { execa } = await import('execa');
|
|
87
|
+
try {
|
|
88
|
+
await execa('adb', ['devices'], { stdio: 'inherit' });
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.error('❌ ADB not found. Please install Android SDK Platform Tools.');
|
|
92
|
+
console.log('Install: sudo pacman -S android-tools');
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
program
|
|
96
|
+
.command('logs')
|
|
97
|
+
.description('View app logs from connected device')
|
|
98
|
+
.option('--debug', 'Enable debug logging')
|
|
99
|
+
.action(async (options) => {
|
|
100
|
+
const config = await loadConfig();
|
|
101
|
+
const { execa } = await import('execa');
|
|
102
|
+
try {
|
|
103
|
+
await execa('adb', ['logcat', '-c']); // Clear logs
|
|
104
|
+
console.log(`Showing device logs (filter manually for "${config.appName}")...`);
|
|
105
|
+
await execa('adb', ['logcat'], { stdio: 'inherit' });
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
console.error('❌ Failed to view logs:', error);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
program
|
|
112
|
+
.command('uninstall')
|
|
113
|
+
.description('Uninstall app from connected devices')
|
|
114
|
+
.option('--debug', 'Enable debug logging')
|
|
115
|
+
.action(async (options) => {
|
|
116
|
+
const config = await loadConfig();
|
|
117
|
+
const { execa } = await import('execa');
|
|
118
|
+
try {
|
|
119
|
+
await execa('adb', ['uninstall', config.appId], { stdio: 'inherit' });
|
|
120
|
+
console.log(`✅ Uninstalled ${config.appName} from device`);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
console.error('❌ Failed to uninstall:', error);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
program
|
|
127
|
+
.command('ios')
|
|
128
|
+
.description('Prepare iOS project for Mac handoff')
|
|
129
|
+
.option('--debug', 'Enable debug logging')
|
|
130
|
+
.action(async (options) => {
|
|
131
|
+
const config = await loadConfig();
|
|
132
|
+
const ctx = createContext(process.cwd(), config, options.debug);
|
|
133
|
+
const iosStep = await loadPlugin('prepare-ios', config);
|
|
134
|
+
await runPipeline(ctx, [iosStep]);
|
|
135
|
+
});
|
|
136
|
+
program
|
|
137
|
+
.command('ios:assets')
|
|
138
|
+
.description('Generate iOS app icons and launch screens')
|
|
139
|
+
.option('--debug', 'Enable debug logging')
|
|
140
|
+
.action(async (options) => {
|
|
141
|
+
throw new Error('`deploid ios:assets` is not implemented in Deploid 2.0 yet.');
|
|
142
|
+
});
|
|
143
|
+
program
|
|
144
|
+
.command('ios:handbook')
|
|
145
|
+
.description('Generate iOS handoff documentation')
|
|
146
|
+
.option('--debug', 'Enable debug logging')
|
|
147
|
+
.action(async (options) => {
|
|
148
|
+
const config = await loadConfig();
|
|
149
|
+
const ctx = createContext(process.cwd(), config, options.debug);
|
|
150
|
+
const iosStep = await loadPlugin('prepare-ios', config);
|
|
151
|
+
await runPipeline(ctx, [iosStep]);
|
|
152
|
+
});
|
|
153
|
+
program
|
|
154
|
+
.command('firebase')
|
|
155
|
+
.description('Setup Firebase for push notifications')
|
|
156
|
+
.option('--project-id <id>', 'Firebase project ID')
|
|
157
|
+
.option('--auto-create', 'Auto-create Firebase project')
|
|
158
|
+
.option('--debug', 'Enable debug logging')
|
|
159
|
+
.action(async (options) => {
|
|
160
|
+
const { setupFirebase } = await import('./firebase.js');
|
|
161
|
+
await setupFirebase(options);
|
|
162
|
+
});
|
|
163
|
+
program
|
|
164
|
+
.command('plugin')
|
|
165
|
+
.description('Manage Deploid plugins')
|
|
166
|
+
.option('--list', 'List available plugins')
|
|
167
|
+
.option('--install <plugin>', 'Install a specific plugin')
|
|
168
|
+
.option('--remove <plugin>', 'Remove a plugin')
|
|
169
|
+
.option('--debug', 'Enable debug logging')
|
|
170
|
+
.action(async (options) => {
|
|
171
|
+
const { managePlugins } = await import('./plugin-manager.js');
|
|
172
|
+
await managePlugins(options);
|
|
173
|
+
});
|
|
174
|
+
program
|
|
175
|
+
.command('publish')
|
|
176
|
+
.description('Upload to Play Store or GitHub')
|
|
177
|
+
.option('--debug', 'Enable debug logging')
|
|
178
|
+
.action(async (options) => {
|
|
179
|
+
throw new Error('`deploid publish` is not implemented in Deploid 2.0 yet.');
|
|
180
|
+
});
|
|
181
|
+
program.parseAsync();
|
|
182
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/init.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface InitOptions {
|
|
2
|
+
framework: 'vite' | 'next' | 'cra' | 'static';
|
|
3
|
+
packaging: 'capacitor' | 'tauri' | 'twa';
|
|
4
|
+
firebase?: boolean;
|
|
5
|
+
firebaseProjectId?: string;
|
|
6
|
+
firebaseApiKey?: string;
|
|
7
|
+
allPlugins?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function initProject(options: InitOptions): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC9C,SAAS,EAAE,WAAW,GAAG,OAAO,GAAG,KAAK,CAAC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDrE"}
|