rn-firebase-onboard 1.0.1
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/GoogleService-Info.plist +30 -0
- package/LICENSE +21 -0
- package/README.md +427 -0
- package/build/commands/enable.d.ts +2 -0
- package/build/commands/enable.d.ts.map +1 -0
- package/build/commands/enable.js +83 -0
- package/build/commands/enable.js.map +1 -0
- package/build/commands/login.d.ts +2 -0
- package/build/commands/login.d.ts.map +1 -0
- package/build/commands/login.js +159 -0
- package/build/commands/login.js.map +1 -0
- package/build/commands/setup.d.ts +2 -0
- package/build/commands/setup.d.ts.map +1 -0
- package/build/commands/setup.js +347 -0
- package/build/commands/setup.js.map +1 -0
- package/build/commands/sha.d.ts +7 -0
- package/build/commands/sha.d.ts.map +1 -0
- package/build/commands/sha.js +227 -0
- package/build/commands/sha.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +59 -0
- package/build/index.js.map +1 -0
- package/build/utils/checker.d.ts +2 -0
- package/build/utils/checker.d.ts.map +1 -0
- package/build/utils/checker.js +100 -0
- package/build/utils/checker.js.map +1 -0
- package/build/utils/logger.d.ts +11 -0
- package/build/utils/logger.d.ts.map +1 -0
- package/build/utils/logger.js +18 -0
- package/build/utils/logger.js.map +1 -0
- package/build/utils/runner.d.ts +8 -0
- package/build/utils/runner.d.ts.map +1 -0
- package/build/utils/runner.js +149 -0
- package/build/utils/runner.js.map +1 -0
- package/dist/commands/enable.d.ts +2 -0
- package/dist/commands/enable.d.ts.map +1 -0
- package/dist/commands/enable.js +65 -0
- package/dist/commands/enable.js.map +1 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +86 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/setup.d.ts +2 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +133 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/sha.d.ts +2 -0
- package/dist/commands/sha.d.ts.map +1 -0
- package/dist/commands/sha.js +118 -0
- package/dist/commands/sha.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/checker.d.ts +2 -0
- package/dist/utils/checker.d.ts.map +1 -0
- package/dist/utils/checker.js +100 -0
- package/dist/utils/checker.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +18 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/runner.d.ts +4 -0
- package/dist/utils/runner.d.ts.map +1 -0
- package/dist/utils/runner.js +36 -0
- package/dist/utils/runner.js.map +1 -0
- package/google-services.json +29 -0
- package/package.json +56 -0
- package/src/commands/enable.ts +89 -0
- package/src/commands/login.ts +162 -0
- package/src/commands/setup.ts +354 -0
- package/src/commands/sha.ts +240 -0
- package/src/index.ts +65 -0
- package/src/utils/checker.ts +70 -0
- package/src/utils/logger.ts +13 -0
- package/src/utils/runner.ts +123 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.loginCommand = loginCommand;
|
|
7
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
8
|
+
const runner_1 = require("../utils/runner");
|
|
9
|
+
const logger_1 = require("../utils/logger");
|
|
10
|
+
async function loginCommand() {
|
|
11
|
+
logger_1.logger.title('Firebase Account Manager');
|
|
12
|
+
// ── Get current logged-in accounts ──────────────────────────
|
|
13
|
+
logger_1.logger.step('Fetching logged-in Firebase accounts...');
|
|
14
|
+
const accountsRaw = (0, runner_1.runSilent)('firebase', ['login:list']);
|
|
15
|
+
// Parse emails from output
|
|
16
|
+
const emailRegex = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;
|
|
17
|
+
const accounts = accountsRaw.match(emailRegex) ?? [];
|
|
18
|
+
if (accounts.length > 0) {
|
|
19
|
+
logger_1.logger.info('Currently logged-in accounts:');
|
|
20
|
+
accounts.forEach((acc, i) => console.log(` ${i + 1}. ${acc}`));
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
logger_1.logger.warn('No accounts logged in yet.');
|
|
24
|
+
}
|
|
25
|
+
console.log('');
|
|
26
|
+
// ── Ask what the user wants to do (loop until cancel) ──────
|
|
27
|
+
let continueMenu = true;
|
|
28
|
+
let currentAccounts = accounts;
|
|
29
|
+
while (continueMenu) {
|
|
30
|
+
const { action } = await inquirer_1.default.prompt([
|
|
31
|
+
{
|
|
32
|
+
type: 'list',
|
|
33
|
+
name: 'action',
|
|
34
|
+
message: 'What do you want to do?',
|
|
35
|
+
choices: [
|
|
36
|
+
{ name: '🔑 Login with a new Google account', value: 'login' },
|
|
37
|
+
{ name: '🔄 Switch to a different account', value: 'switch' },
|
|
38
|
+
{ name: '📋 List all logged-in accounts', value: 'list' },
|
|
39
|
+
{ name: '🚪 Logout from current account', value: 'logout' },
|
|
40
|
+
{ name: '⬅️ Continue to next step', value: 'cancel' },
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
]);
|
|
44
|
+
if (action === 'cancel') {
|
|
45
|
+
continueMenu = false;
|
|
46
|
+
}
|
|
47
|
+
// ── Login ────────────────────────────────────────────────────
|
|
48
|
+
else if (action === 'login') {
|
|
49
|
+
const { loginMode } = await inquirer_1.default.prompt([{
|
|
50
|
+
type: 'list',
|
|
51
|
+
name: 'loginMode',
|
|
52
|
+
message: 'How do you want to authenticate?',
|
|
53
|
+
choices: [
|
|
54
|
+
{ name: '🌐 Auto-open browser (default)', value: 'browser' },
|
|
55
|
+
{ name: '🔗 Copy-paste URL (browser cannot open automatically)', value: 'nolocalhost' },
|
|
56
|
+
],
|
|
57
|
+
}]);
|
|
58
|
+
// `firebase login:add` requires at least one existing account.
|
|
59
|
+
// When no accounts are present at all, use `firebase login` instead.
|
|
60
|
+
const isFirstAccount = currentAccounts.length === 0;
|
|
61
|
+
if (isFirstAccount) {
|
|
62
|
+
// First-time login
|
|
63
|
+
if (loginMode === 'nolocalhost') {
|
|
64
|
+
logger_1.logger.info('A URL will be printed — open it in any browser and paste back the code.');
|
|
65
|
+
(0, runner_1.runLive)('firebase', ['login', '--no-localhost']);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
logger_1.logger.info('Opening browser for first-time Firebase login...');
|
|
69
|
+
(0, runner_1.runLive)('firebase', ['login']);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
// Add another account on top of existing ones
|
|
74
|
+
if (loginMode === 'nolocalhost') {
|
|
75
|
+
logger_1.logger.info('A URL will be printed — open it in any browser and paste back the code.');
|
|
76
|
+
(0, runner_1.runLive)('firebase', ['login:add', '--no-localhost']);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
logger_1.logger.info('Opening browser to add a new Google account...');
|
|
80
|
+
(0, runner_1.runLive)('firebase', ['login:add']);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Refresh and show all accounts, marking the newly added one
|
|
84
|
+
const refreshedRaw = (0, runner_1.runSilent)('firebase', ['login:list']);
|
|
85
|
+
const refreshedAccounts = refreshedRaw.match(emailRegex) ?? [];
|
|
86
|
+
const newAccounts = refreshedAccounts.filter((acc) => !currentAccounts.includes(acc));
|
|
87
|
+
currentAccounts = refreshedAccounts;
|
|
88
|
+
if (newAccounts.length > 0) {
|
|
89
|
+
logger_1.logger.success(`Account added: ${newAccounts.join(', ')}`);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
logger_1.logger.warn('No new account was detected. The account may already be registered.');
|
|
93
|
+
}
|
|
94
|
+
if (currentAccounts.length > 0) {
|
|
95
|
+
logger_1.logger.info('All logged-in accounts:');
|
|
96
|
+
currentAccounts.forEach((acc) => {
|
|
97
|
+
const isNew = newAccounts.includes(acc);
|
|
98
|
+
console.log(` ${isNew ? '🆕' : ' •'} ${acc}${isNew ? ' ← just added' : ''}`);
|
|
99
|
+
});
|
|
100
|
+
console.log('');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// ── Switch account ───────────────────────────────────────────
|
|
104
|
+
else if (action === 'switch') {
|
|
105
|
+
if (currentAccounts.length === 0) {
|
|
106
|
+
logger_1.logger.error('No accounts found. Use "Login with a new Google account" to add one.');
|
|
107
|
+
}
|
|
108
|
+
else if (currentAccounts.length === 1) {
|
|
109
|
+
logger_1.logger.warn(`Only one account is registered: ${currentAccounts[0]}`);
|
|
110
|
+
logger_1.logger.info('Use "🔑 Login with a new Google account" to add more accounts first.');
|
|
111
|
+
console.log('');
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
const { selectedAccount } = await inquirer_1.default.prompt([
|
|
115
|
+
{
|
|
116
|
+
type: 'list',
|
|
117
|
+
name: 'selectedAccount',
|
|
118
|
+
message: 'Select the account to switch to:',
|
|
119
|
+
choices: currentAccounts,
|
|
120
|
+
},
|
|
121
|
+
]);
|
|
122
|
+
(0, runner_1.runLive)('firebase', ['login:use', selectedAccount]);
|
|
123
|
+
logger_1.logger.success(`Switched to: ${selectedAccount}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// ── List accounts ─────────────────────────────────────────────
|
|
127
|
+
else if (action === 'list') {
|
|
128
|
+
const refreshed = (0, runner_1.runSilent)('firebase', ['login:list']);
|
|
129
|
+
currentAccounts = refreshed.match(emailRegex) ?? [];
|
|
130
|
+
if (currentAccounts.length > 0) {
|
|
131
|
+
logger_1.logger.info('All logged-in accounts:');
|
|
132
|
+
currentAccounts.forEach((acc, i) => console.log(` ${i + 1}. ${acc}`));
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
logger_1.logger.warn('No accounts are currently logged in.');
|
|
136
|
+
}
|
|
137
|
+
console.log('');
|
|
138
|
+
}
|
|
139
|
+
// ── Logout ───────────────────────────────────────────────────
|
|
140
|
+
else if (action === 'logout') {
|
|
141
|
+
const { confirmLogout } = await inquirer_1.default.prompt([
|
|
142
|
+
{
|
|
143
|
+
type: 'confirm',
|
|
144
|
+
name: 'confirmLogout',
|
|
145
|
+
message: 'Are you sure you want to logout?',
|
|
146
|
+
default: false,
|
|
147
|
+
},
|
|
148
|
+
]);
|
|
149
|
+
if (confirmLogout) {
|
|
150
|
+
(0, runner_1.runLive)('firebase', ['logout']);
|
|
151
|
+
logger_1.logger.success('Logged out successfully!');
|
|
152
|
+
// Refresh after logout
|
|
153
|
+
const refreshed = (0, runner_1.runSilent)('firebase', ['login:list']);
|
|
154
|
+
currentAccounts = refreshed.match(emailRegex) ?? [];
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAiIA,wBAAsB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAgO/D"}
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.setupCommand = setupCommand;
|
|
40
|
+
const fs_1 = require("fs");
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
43
|
+
const ora_1 = __importDefault(require("ora"));
|
|
44
|
+
const checker_1 = require("../utils/checker");
|
|
45
|
+
const login_1 = require("./login");
|
|
46
|
+
const sha_1 = require("./sha");
|
|
47
|
+
const enable_1 = require("./enable");
|
|
48
|
+
const runner_1 = require("../utils/runner");
|
|
49
|
+
const logger_1 = require("../utils/logger");
|
|
50
|
+
function parseFirebaseResult(output, label) {
|
|
51
|
+
try {
|
|
52
|
+
const parsed = JSON.parse(output);
|
|
53
|
+
if (parsed.result === undefined) {
|
|
54
|
+
throw new Error('Missing result field');
|
|
55
|
+
}
|
|
56
|
+
return parsed.result;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
throw new Error(`Could not parse Firebase ${label} output.`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function getAndroidConfigPath(cwd) {
|
|
63
|
+
const androidAppDir = path.join(cwd, 'android', 'app');
|
|
64
|
+
if ((0, fs_1.existsSync)(androidAppDir)) {
|
|
65
|
+
return path.join(androidAppDir, 'google-services.json');
|
|
66
|
+
}
|
|
67
|
+
// No android/ folder yet (Expo managed before prebuild) — put at project root
|
|
68
|
+
// so the Expo config plugin can pick it up from app.json's googleServicesFile.
|
|
69
|
+
return path.join(cwd, 'google-services.json');
|
|
70
|
+
}
|
|
71
|
+
function getIosConfigPath(cwd) {
|
|
72
|
+
const iosDir = path.join(cwd, 'ios');
|
|
73
|
+
if (!(0, fs_1.existsSync)(iosDir)) {
|
|
74
|
+
// No ios/ folder yet (Expo managed before prebuild) — put at project root
|
|
75
|
+
// so the Expo config plugin can pick it up from app.json's googleServicesFile.
|
|
76
|
+
return path.join(cwd, 'GoogleService-Info.plist');
|
|
77
|
+
}
|
|
78
|
+
const xcodeProject = (0, fs_1.readdirSync)(iosDir).find((entry) => entry.endsWith('.xcodeproj'));
|
|
79
|
+
if (xcodeProject) {
|
|
80
|
+
// Always place inside ios/<AppName>/ — mkdirSync in exportFirebaseConfig will
|
|
81
|
+
// create the folder if it does not exist yet.
|
|
82
|
+
return path.join(iosDir, path.basename(xcodeProject, '.xcodeproj'), 'GoogleService-Info.plist');
|
|
83
|
+
}
|
|
84
|
+
return path.join(iosDir, 'GoogleService-Info.plist');
|
|
85
|
+
}
|
|
86
|
+
function validateMobileIdentifier(value) {
|
|
87
|
+
return /^[A-Za-z][A-Za-z0-9_]*(\.[A-Za-z][A-Za-z0-9_]*)+$/.test(value.trim())
|
|
88
|
+
? true
|
|
89
|
+
: 'Enter a valid identifier like com.example.app';
|
|
90
|
+
}
|
|
91
|
+
function listFirebaseProjects() {
|
|
92
|
+
const output = (0, runner_1.runCheckedOutput)('firebase', ['projects:list', '--json']);
|
|
93
|
+
return parseFirebaseResult(output, 'project list');
|
|
94
|
+
}
|
|
95
|
+
function listFirebaseApps(platform, projectId) {
|
|
96
|
+
const output = (0, runner_1.runCheckedOutput)('firebase', ['apps:list', platform, '--project', projectId, '--json']);
|
|
97
|
+
return parseFirebaseResult(output, `${platform} app list`);
|
|
98
|
+
}
|
|
99
|
+
function ensureFirebaseApp(platform, projectId, displayName, identifier) {
|
|
100
|
+
const existingApps = listFirebaseApps(platform, projectId);
|
|
101
|
+
const match = existingApps.find((app) => platform === 'ANDROID' ? app.packageName === identifier : app.bundleId === identifier);
|
|
102
|
+
if (match) {
|
|
103
|
+
logger_1.logger.success(`${platform} app already exists: ${match.appId}`);
|
|
104
|
+
return match;
|
|
105
|
+
}
|
|
106
|
+
logger_1.logger.step(`Creating Firebase ${platform} app...`);
|
|
107
|
+
const identifierFlag = platform === 'ANDROID' ? '--package-name' : '--bundle-id';
|
|
108
|
+
const output = (0, runner_1.runCheckedOutput)('firebase', [
|
|
109
|
+
'apps:create',
|
|
110
|
+
platform,
|
|
111
|
+
displayName,
|
|
112
|
+
identifierFlag,
|
|
113
|
+
identifier,
|
|
114
|
+
'--project',
|
|
115
|
+
projectId,
|
|
116
|
+
'--json',
|
|
117
|
+
]);
|
|
118
|
+
return parseFirebaseResult(output, `${platform} app creation`);
|
|
119
|
+
}
|
|
120
|
+
function exportFirebaseConfig(platform, appId, outputPath) {
|
|
121
|
+
(0, fs_1.mkdirSync)(path.dirname(outputPath), { recursive: true });
|
|
122
|
+
logger_1.logger.step(`Writing ${path.basename(outputPath)}...`);
|
|
123
|
+
(0, runner_1.runLive)('firebase', ['apps:sdkconfig', platform, appId, '-o', outputPath]);
|
|
124
|
+
logger_1.logger.success(`Saved ${platform} config to ${outputPath}`);
|
|
125
|
+
}
|
|
126
|
+
async function setupCommand(full) {
|
|
127
|
+
logger_1.logger.title('RN Firebase Onboard — Setup Wizard');
|
|
128
|
+
console.log('This wizard will set up Firebase for your React Native project.\n');
|
|
129
|
+
// ── STEP 1: Check & install all tools ───────────────────────
|
|
130
|
+
await (0, checker_1.checkAllTools)();
|
|
131
|
+
// ── STEP 2: Firebase login ───────────────────────────────────
|
|
132
|
+
logger_1.logger.step('STEP 2 — Firebase Login');
|
|
133
|
+
const { doLogin } = await inquirer_1.default.prompt([{
|
|
134
|
+
type: 'confirm',
|
|
135
|
+
name: 'doLogin',
|
|
136
|
+
message: 'Do you want to manage your Firebase login now?',
|
|
137
|
+
default: true,
|
|
138
|
+
}]);
|
|
139
|
+
if (doLogin)
|
|
140
|
+
await (0, login_1.loginCommand)();
|
|
141
|
+
// ── STEP 3: Create or select Firebase project ────────────────
|
|
142
|
+
logger_1.logger.step('STEP 3 — Firebase Project');
|
|
143
|
+
logger_1.logger.info('Fetching your existing Firebase projects...');
|
|
144
|
+
const existingProjects = listFirebaseProjects();
|
|
145
|
+
const { projectAction } = await inquirer_1.default.prompt([{
|
|
146
|
+
type: 'list',
|
|
147
|
+
name: 'projectAction',
|
|
148
|
+
message: 'What do you want to do?',
|
|
149
|
+
choices: [
|
|
150
|
+
{ name: '➕ Create a new Firebase project', value: 'create' },
|
|
151
|
+
{ name: '✅ Use an existing project', value: 'existing' },
|
|
152
|
+
],
|
|
153
|
+
}]);
|
|
154
|
+
let projectId = '';
|
|
155
|
+
if (projectAction === 'create') {
|
|
156
|
+
const { newProjectId } = await inquirer_1.default.prompt([{
|
|
157
|
+
type: 'input',
|
|
158
|
+
name: 'newProjectId',
|
|
159
|
+
message: 'Enter new Firebase project ID:',
|
|
160
|
+
validate: (val) => {
|
|
161
|
+
const id = val.trim();
|
|
162
|
+
if (id.length === 0)
|
|
163
|
+
return 'Project ID cannot be empty.';
|
|
164
|
+
if (id.length < 6)
|
|
165
|
+
return 'Project ID must be at least 6 characters.';
|
|
166
|
+
if (id.length > 30)
|
|
167
|
+
return 'Project ID must be 30 characters or fewer.';
|
|
168
|
+
if (!/^[a-z]/.test(id))
|
|
169
|
+
return 'Project ID must start with a lowercase letter (a–z).';
|
|
170
|
+
if (!/^[a-z0-9-]+$/.test(id))
|
|
171
|
+
return 'Project ID can only contain lowercase letters (a–z), numbers (0–9), and hyphens (-).';
|
|
172
|
+
if (id.endsWith('-'))
|
|
173
|
+
return 'Project ID cannot end with a hyphen.';
|
|
174
|
+
if (/--/.test(id))
|
|
175
|
+
return 'Project ID cannot contain consecutive hyphens (--).';
|
|
176
|
+
return true;
|
|
177
|
+
},
|
|
178
|
+
}]);
|
|
179
|
+
projectId = newProjectId.trim();
|
|
180
|
+
const spinner = (0, ora_1.default)(`Creating Firebase project: ${projectId}...`).start();
|
|
181
|
+
try {
|
|
182
|
+
(0, runner_1.runLive)('firebase', ['projects:create', projectId]);
|
|
183
|
+
spinner.succeed(`Project "${projectId}" created!`);
|
|
184
|
+
}
|
|
185
|
+
catch (e) {
|
|
186
|
+
spinner.fail('Project creation failed!');
|
|
187
|
+
// ── Real-Time Diagnostics (like fire_pilot) ──────────────
|
|
188
|
+
if (e.message.includes('quota')) {
|
|
189
|
+
logger_1.logger.error('REASON: Firebase project quota exceeded.');
|
|
190
|
+
logger_1.logger.info('Fix: Delete old projects at https://console.firebase.google.com');
|
|
191
|
+
}
|
|
192
|
+
else if (e.message.includes('already exists')) {
|
|
193
|
+
logger_1.logger.error('REASON: A project with this ID already exists.');
|
|
194
|
+
logger_1.logger.info('Fix: Choose a different project ID.');
|
|
195
|
+
}
|
|
196
|
+
else if (e.message.includes('invalid') ||
|
|
197
|
+
e.message.includes('Invalid') ||
|
|
198
|
+
e.message.includes('INVALID_ARGUMENT')) {
|
|
199
|
+
logger_1.logger.error('REASON: The project ID format is invalid.');
|
|
200
|
+
logger_1.logger.info('Firebase project ID rules:');
|
|
201
|
+
console.log(' • 6–30 characters long');
|
|
202
|
+
console.log(' • Must start with a lowercase letter (a–z)');
|
|
203
|
+
console.log(' • Only lowercase letters (a–z), numbers (0–9), and hyphens (-)');
|
|
204
|
+
console.log(' • Cannot end with a hyphen or contain consecutive hyphens (--).');
|
|
205
|
+
console.log(' • Example: my-app-12345');
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
logger_1.logger.error('REASON: ' + e.message);
|
|
209
|
+
}
|
|
210
|
+
process.exit(1);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
if (existingProjects.length === 0) {
|
|
215
|
+
logger_1.logger.error('No Firebase projects found for the current account.');
|
|
216
|
+
process.exit(1);
|
|
217
|
+
}
|
|
218
|
+
const { existingId } = await inquirer_1.default.prompt([{
|
|
219
|
+
type: 'list',
|
|
220
|
+
name: 'existingId',
|
|
221
|
+
message: 'Select the Firebase project to use:',
|
|
222
|
+
choices: existingProjects.map((project) => ({
|
|
223
|
+
name: `${project.displayName} (${project.projectId})`,
|
|
224
|
+
value: project.projectId,
|
|
225
|
+
})),
|
|
226
|
+
}]);
|
|
227
|
+
projectId = existingId;
|
|
228
|
+
}
|
|
229
|
+
// ── STEP 4: Install @react-native-firebase/app ───────────────
|
|
230
|
+
logger_1.logger.step('STEP 4 — Install React Native Firebase Core');
|
|
231
|
+
const expo = (0, runner_1.isExpoProject)();
|
|
232
|
+
const installCmd = expo ? 'npx' : 'npm';
|
|
233
|
+
const installArgs = expo
|
|
234
|
+
? ['expo', 'install', '@react-native-firebase/app']
|
|
235
|
+
: ['install', '@react-native-firebase/app'];
|
|
236
|
+
const spinner2 = (0, ora_1.default)('Installing @react-native-firebase/app...').start();
|
|
237
|
+
try {
|
|
238
|
+
(0, runner_1.runLive)(installCmd, installArgs);
|
|
239
|
+
spinner2.succeed('@react-native-firebase/app installed!');
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
const manualCmd = expo
|
|
243
|
+
? 'npx expo install @react-native-firebase/app'
|
|
244
|
+
: 'npm install @react-native-firebase/app';
|
|
245
|
+
spinner2.fail(`Installation failed. Run manually: ${manualCmd}`);
|
|
246
|
+
}
|
|
247
|
+
// ── STEP 5: Create apps and download config files ───────────
|
|
248
|
+
logger_1.logger.step('STEP 5 — Firebase App Setup');
|
|
249
|
+
const defaultDisplayName = path.basename(process.cwd());
|
|
250
|
+
const { platforms, appDisplayName, androidPackageName, iosBundleId } = await inquirer_1.default.prompt([
|
|
251
|
+
{
|
|
252
|
+
type: 'checkbox',
|
|
253
|
+
name: 'platforms',
|
|
254
|
+
message: 'Create or configure Firebase apps for:',
|
|
255
|
+
choices: [
|
|
256
|
+
{ name: 'Android', value: 'ANDROID', checked: true },
|
|
257
|
+
{ name: 'iOS', value: 'IOS', checked: true },
|
|
258
|
+
],
|
|
259
|
+
validate: (selected) => selected.length > 0 ? true : 'Select at least one platform',
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
type: 'input',
|
|
263
|
+
name: 'appDisplayName',
|
|
264
|
+
message: 'Enter the Firebase app display name:',
|
|
265
|
+
default: defaultDisplayName,
|
|
266
|
+
validate: (value) => value.trim().length > 0 ? true : 'Display name cannot be empty',
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
type: 'input',
|
|
270
|
+
name: 'androidPackageName',
|
|
271
|
+
message: 'Enter the Android package name:',
|
|
272
|
+
when: (answers) => answers.platforms.includes('ANDROID'),
|
|
273
|
+
validate: validateMobileIdentifier,
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
type: 'input',
|
|
277
|
+
name: 'iosBundleId',
|
|
278
|
+
message: 'Enter the iOS bundle identifier:',
|
|
279
|
+
when: (answers) => answers.platforms.includes('IOS'),
|
|
280
|
+
validate: validateMobileIdentifier,
|
|
281
|
+
},
|
|
282
|
+
]);
|
|
283
|
+
let androidAppId;
|
|
284
|
+
if (platforms.includes('ANDROID')) {
|
|
285
|
+
if (!androidPackageName) {
|
|
286
|
+
logger_1.logger.error('Android package name is required to create or configure the Android app.');
|
|
287
|
+
process.exit(1);
|
|
288
|
+
}
|
|
289
|
+
const androidApp = ensureFirebaseApp('ANDROID', projectId, appDisplayName.trim(), androidPackageName.trim());
|
|
290
|
+
androidAppId = androidApp.appId;
|
|
291
|
+
exportFirebaseConfig('ANDROID', androidAppId, getAndroidConfigPath(process.cwd()));
|
|
292
|
+
}
|
|
293
|
+
if (platforms.includes('IOS')) {
|
|
294
|
+
if (!iosBundleId) {
|
|
295
|
+
logger_1.logger.error('iOS bundle identifier is required to create or configure the iOS app.');
|
|
296
|
+
process.exit(1);
|
|
297
|
+
}
|
|
298
|
+
const iosApp = ensureFirebaseApp('IOS', projectId, appDisplayName.trim(), iosBundleId.trim());
|
|
299
|
+
exportFirebaseConfig('IOS', iosApp.appId, getIosConfigPath(process.cwd()));
|
|
300
|
+
}
|
|
301
|
+
// ── STEP 6: SHA keys (only if --full) ───────────────────────
|
|
302
|
+
if (full) {
|
|
303
|
+
logger_1.logger.step('STEP 6 — SHA Key Registration');
|
|
304
|
+
const { doSha } = await inquirer_1.default.prompt([{
|
|
305
|
+
type: 'confirm',
|
|
306
|
+
name: 'doSha',
|
|
307
|
+
message: 'Do you want to register Android SHA keys now?',
|
|
308
|
+
default: true,
|
|
309
|
+
}]);
|
|
310
|
+
if (doSha && androidAppId) {
|
|
311
|
+
await (0, sha_1.shaCommand)({ projectId, appId: androidAppId });
|
|
312
|
+
}
|
|
313
|
+
else if (doSha) {
|
|
314
|
+
logger_1.logger.warn('Skipping SHA registration because no Android app was configured in this run.');
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
// ── STEP 7: Enable Firebase features ────────────────────────
|
|
318
|
+
logger_1.logger.step('STEP 7 — Enable Firebase Features');
|
|
319
|
+
const { doFeatures } = await inquirer_1.default.prompt([{
|
|
320
|
+
type: 'confirm',
|
|
321
|
+
name: 'doFeatures',
|
|
322
|
+
message: 'Do you want to install additional Firebase features (Auth, Firestore, etc)?',
|
|
323
|
+
default: true,
|
|
324
|
+
}]);
|
|
325
|
+
if (doFeatures)
|
|
326
|
+
await (0, enable_1.enableCommand)();
|
|
327
|
+
// ── DONE ─────────────────────────────────────────────────────
|
|
328
|
+
const isExpo = (0, runner_1.isExpoProject)();
|
|
329
|
+
console.log('\n' + '─'.repeat(60));
|
|
330
|
+
logger_1.logger.success('🎉 Firebase setup complete!');
|
|
331
|
+
console.log('─'.repeat(60));
|
|
332
|
+
logger_1.logger.info('Next steps:');
|
|
333
|
+
console.log(' 1. Verify google-services.json and GoogleService-Info.plist were written to your project');
|
|
334
|
+
if (isExpo) {
|
|
335
|
+
console.log(' 2. Add the Firebase config plugin to app.json:');
|
|
336
|
+
console.log(' { "plugins": ["@react-native-firebase/app"] }');
|
|
337
|
+
console.log(' 3. Run: npx expo prebuild (generates native android/ and ios/ folders)');
|
|
338
|
+
console.log(' 4. Run: npx expo run:android OR npx expo run:ios');
|
|
339
|
+
console.log(' 5. Full guide: https://rnfirebase.io and https://docs.expo.dev/guides/using-firebase/');
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
console.log(' 2. Follow platform setup at https://rnfirebase.io');
|
|
343
|
+
console.log(' 3. Run your app: npx react-native run-android');
|
|
344
|
+
}
|
|
345
|
+
console.log('─'.repeat(60) + '\n');
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sha.d.ts","sourceRoot":"","sources":["../../src/commands/sha.ts"],"names":[],"mappings":"AA4BA,KAAK,iBAAiB,GAAG;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAUF,wBAAsB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsM/E"}
|