@muritavo/testing-toolkit 0.3.0 → 0.3.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.
@@ -0,0 +1,284 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
37
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
38
+ return new (P || (P = Promise))(function (resolve, reject) {
39
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
40
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
41
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
42
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
43
+ });
44
+ };
45
+ var __generator = (this && this.__generator) || function (thisArg, body) {
46
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
47
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
48
+ function verb(n) { return function (v) { return step([n, v]); }; }
49
+ function step(op) {
50
+ if (f) throw new TypeError("Generator is already executing.");
51
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
52
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
53
+ if (y = 0, t) op = [op[0] & 2, t.value];
54
+ switch (op[0]) {
55
+ case 0: case 1: t = op; break;
56
+ case 4: _.label++; return { value: op[1], done: false };
57
+ case 5: _.label++; y = op[1]; op = [0]; continue;
58
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
59
+ default:
60
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
61
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
62
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
63
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
64
+ if (t[2]) _.ops.pop();
65
+ _.trys.pop(); continue;
66
+ }
67
+ op = body.call(thisArg, _);
68
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
69
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
70
+ }
71
+ };
72
+ var __importDefault = (this && this.__importDefault) || function (mod) {
73
+ return (mod && mod.__esModule) ? mod : { "default": mod };
74
+ };
75
+ Object.defineProperty(exports, "__esModule", { value: true });
76
+ exports.deployContract = exports.startBlockchain = void 0;
77
+ var debug_1 = __importDefault(require("debug"));
78
+ var task_names_1 = require("hardhat/builtin-tasks/task-names");
79
+ var abi_1 = require("@ethersproject/abi");
80
+ var logger = (0, debug_1.default)("@muritavo/testing-toolkit/blockchain");
81
+ var instance;
82
+ function startBlockchain(_a) {
83
+ return __awaiter(this, arguments, void 0, function (_b) {
84
+ var prevFork, serverInstance, accounts;
85
+ var _this = this;
86
+ var projectFolder = _b.projectRootFolder, _c = _b.port, port = _c === void 0 ? 8545 : _c;
87
+ return __generator(this, function (_d) {
88
+ switch (_d.label) {
89
+ case 0:
90
+ if (!instance) return [3 /*break*/, 3];
91
+ prevFork = instance.process.config.networks.hardhat.forking;
92
+ if (!prevFork) return [3 /*break*/, 2];
93
+ return [4 /*yield*/, instance.process.network.provider.request({
94
+ method: "hardhat_reset",
95
+ params: [
96
+ {
97
+ forking: {
98
+ jsonRpcUrl: prevFork.url,
99
+ blockNumber: prevFork.blockNumber,
100
+ },
101
+ },
102
+ ],
103
+ })];
104
+ case 1:
105
+ _d.sent();
106
+ _d.label = 2;
107
+ case 2: return [2 /*return*/, instance.addresses];
108
+ case 3:
109
+ if (projectFolder)
110
+ logger("Starting blockchain server at \"".concat(projectFolder, "\""));
111
+ return [4 /*yield*/, initHardhat(projectFolder)];
112
+ case 4:
113
+ serverInstance = _d.sent();
114
+ return [4 /*yield*/, new Promise(function (r, rej) {
115
+ var timeoutId = setTimeout(function () {
116
+ rej(new Error("Something went wrong while starting hardhat node"));
117
+ }, 30000);
118
+ serverInstance.tasks[task_names_1.TASK_NODE_SERVER_READY].setAction(function () { return __awaiter(_this, void 0, void 0, function () {
119
+ return __generator(this, function (_a) {
120
+ clearTimeout(timeoutId);
121
+ r();
122
+ return [2 /*return*/];
123
+ });
124
+ }); });
125
+ serverInstance.run("node", {
126
+ port: port,
127
+ });
128
+ })];
129
+ case 5:
130
+ _d.sent();
131
+ accounts = new Array(serverInstance.config.networks.hardhat.accounts.count)
132
+ .fill(undefined)
133
+ .reduce(function (res, _, idx) {
134
+ var _a;
135
+ var account = deployer(idx, serverInstance);
136
+ return __assign(__assign({}, res), (_a = {}, _a[account.address] = {
137
+ secretKey: account.key,
138
+ }, _a));
139
+ }, {});
140
+ instance = {
141
+ process: serverInstance,
142
+ rootFolder: projectFolder,
143
+ contracts: {},
144
+ addresses: accounts,
145
+ port: port,
146
+ };
147
+ return [2 /*return*/, accounts];
148
+ }
149
+ });
150
+ });
151
+ }
152
+ exports.startBlockchain = startBlockchain;
153
+ function deployer(index, hardhat) {
154
+ if (index === void 0) { index = 0; }
155
+ var ethers = hardhat.ethers;
156
+ var accounts = hardhat.config.networks.hardhat.accounts;
157
+ var wallet = ethers.Wallet.fromMnemonic(accounts.mnemonic, accounts.path + "/".concat(index));
158
+ return {
159
+ key: wallet.privateKey,
160
+ address: wallet.address,
161
+ };
162
+ }
163
+ function initHardhat(dir) {
164
+ return __awaiter(this, void 0, void 0, function () {
165
+ var startingDir, hardhat, e_1;
166
+ var _this = this;
167
+ return __generator(this, function (_a) {
168
+ switch (_a.label) {
169
+ case 0:
170
+ startingDir = process.cwd();
171
+ process.chdir(dir);
172
+ _a.label = 1;
173
+ case 1:
174
+ _a.trys.push([1, 3, , 4]);
175
+ return [4 /*yield*/, (function () { return __awaiter(_this, void 0, void 0, function () {
176
+ var e_2;
177
+ return __generator(this, function (_a) {
178
+ switch (_a.label) {
179
+ case 0:
180
+ _a.trys.push([0, 1, , 3]);
181
+ return [2 /*return*/, require("hardhat")];
182
+ case 1:
183
+ e_2 = _a.sent();
184
+ console.log("Requiring hardhat failed... Trying using import... Check the error below\n", e_2);
185
+ return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require("hardhat")); })];
186
+ case 2: return [2 /*return*/, (_a.sent()).default];
187
+ case 3: return [2 /*return*/];
188
+ }
189
+ });
190
+ }); })()];
191
+ case 2:
192
+ hardhat = (_a.sent());
193
+ process.chdir(startingDir);
194
+ return [2 /*return*/, hardhat];
195
+ case 3:
196
+ e_1 = _a.sent();
197
+ process.chdir(startingDir);
198
+ throw e_1;
199
+ case 4: return [2 /*return*/];
200
+ }
201
+ });
202
+ });
203
+ }
204
+ function deployContract(_a) {
205
+ return __awaiter(this, arguments, void 0, function (_b) {
206
+ var getContract, ethers, owner, Factory, lock_1, connection, initializationKey, e_3;
207
+ var _c, _d;
208
+ var _this = this;
209
+ var contractName = _b.contractName, args = _b.args;
210
+ return __generator(this, function (_e) {
211
+ switch (_e.label) {
212
+ case 0:
213
+ logger("Deploying contract ".concat(contractName, " with ").concat(args.length, " parameters ").concat(args
214
+ .map(function (a) { return "".concat(a, " (").concat(Array.isArray(a) ? "array" : typeof a, ")"); })
215
+ .join(", ")));
216
+ _e.label = 1;
217
+ case 1:
218
+ _e.trys.push([1, 13, , 14]);
219
+ if (!(instance === null || instance === void 0 ? void 0 : instance.rootFolder))
220
+ throw new Error("You are trying to deploy a contract without defining the Blockchain Project folder. Please define it at startBlockchain command.");
221
+ getContract = function () { return __awaiter(_this, void 0, void 0, function () {
222
+ var Web3, web3;
223
+ return __generator(this, function (_a) {
224
+ switch (_a.label) {
225
+ case 0: return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require("web3")); })];
226
+ case 1:
227
+ Web3 = (_a.sent()).default;
228
+ web3 = new Web3("ws://127.0.0.1:".concat(instance.port));
229
+ return [2 /*return*/, new web3.eth.Contract(lock_1.interface.format(abi_1.FormatTypes.json), lock_1.address)];
230
+ }
231
+ });
232
+ }); };
233
+ return [4 /*yield*/, initHardhat(instance.rootFolder)];
234
+ case 2:
235
+ ethers = (_e.sent()).ethers;
236
+ return [4 /*yield*/, ethers.getSigners()];
237
+ case 3:
238
+ owner = (_e.sent())[0];
239
+ return [4 /*yield*/, ethers.getContractFactory(contractName)];
240
+ case 4:
241
+ Factory = _e.sent();
242
+ return [4 /*yield*/, Factory.deploy()];
243
+ case 5:
244
+ lock_1 = _e.sent();
245
+ return [4 /*yield*/, lock_1.deployed()];
246
+ case 6:
247
+ _e.sent();
248
+ if (!(args.length > 0)) return [3 /*break*/, 10];
249
+ logger("Initializing contract with owner ".concat(owner, " and args ").concat(args));
250
+ connection = lock_1.connect(owner);
251
+ initializationKey = Object.keys(connection.functions).find(function (a) { return a.split(",", args.length) && a.startsWith("initialize("); }) || "initialize";
252
+ if (!connection[initializationKey]) return [3 /*break*/, 8];
253
+ return [4 /*yield*/, connection[initializationKey].apply(connection, args)];
254
+ case 7:
255
+ _e.sent();
256
+ _e.label = 8;
257
+ case 8:
258
+ _c = {
259
+ address: lock_1.address,
260
+ owner: owner.address
261
+ };
262
+ return [4 /*yield*/, getContract()];
263
+ case 9: return [2 /*return*/, (_c.contract = _e.sent(),
264
+ _c)];
265
+ case 10:
266
+ _d = {
267
+ address: lock_1.address,
268
+ owner: owner.address
269
+ };
270
+ return [4 /*yield*/, getContract()];
271
+ case 11: return [2 /*return*/, (_d.contract = _e.sent(),
272
+ _d)];
273
+ case 12: return [3 /*break*/, 14];
274
+ case 13:
275
+ e_3 = _e.sent();
276
+ logger("Something has gone wrong", e_3);
277
+ throw e_3;
278
+ case 14: return [2 /*return*/];
279
+ }
280
+ });
281
+ });
282
+ }
283
+ exports.deployContract = deployContract;
284
+ //# sourceMappingURL=blockchain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blockchain.js","sourceRoot":"","sources":["../../../src/native/blockchain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * For some reason, on node 18 "node-fetch" fails when connecting to "localhost" domain
3
+ * So I needed to change to 127.0.0.1
4
+ */
5
+ export declare const LOCALHOST_DOMAIN = "127.0.0.1";
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LOCALHOST_DOMAIN = void 0;
4
+ /**
5
+ * For some reason, on node 18 "node-fetch" fails when connecting to "localhost" domain
6
+ * So I needed to change to 127.0.0.1
7
+ */
8
+ exports.LOCALHOST_DOMAIN = "127.0.0.1";
9
+ //# sourceMappingURL=consts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consts.js","sourceRoot":"","sources":["../../../src/native/consts.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,gBAAgB,GAAG,WAAW,CAAA"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Kills the emulator that was started by this module instance
3
+ *
4
+ * @returns A promise that resolves when the emulator is succesfully killed
5
+ */
6
+ export declare function killEmulator(): Promise<any>;
7
+ /**
8
+ * With this you can start an firebase emulator
9
+ * @param args Check property typings for details
10
+ * @returns A promise that resolves when the emulator is ready or fails if the emulator couldn't start or be reached
11
+ */
12
+ export declare function startEmulator(args: {
13
+ /** The project id used by the emulator */
14
+ projectId: string;
15
+ /** Optionally indicates the database to import data from */
16
+ databaseToImport?: string;
17
+ /** The port where the firebase UI will be running to check if the emulator is up */
18
+ UIPort: number;
19
+ /** An optional flag to indicate when a new emulator instance should be created */
20
+ suiteId?: string;
21
+ ports: number[];
22
+ shouldSaveData: boolean;
23
+ only: ("functions" | "hosting" | "firestore" | "storage" | "auth")[] | string[];
24
+ }, isRetry?: boolean): Promise<null>;
25
+ type Admin = ReturnType<typeof _getAuthAdminInstance>;
26
+ type KeysWithValsOfType<T, V> = keyof {
27
+ [P in keyof T as T[P] extends V ? P : never]: P;
28
+ };
29
+ export declare function invokeAuthAdmin<F extends KeysWithValsOfType<Admin, (...params: any[]) => any>>({ projectId, port, functionName, params, }: {
30
+ projectId: string;
31
+ port: string;
32
+ functionName: F;
33
+ params: Parameters<Admin[F]>;
34
+ }): Promise<any>;
35
+ declare function _getAuthAdminInstance(projectId: string, authPort: string): Promise<any>;
36
+ export {};
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.invokeAuthAdmin = exports.startEmulator = exports.killEmulator = void 0;
43
+ var node_fetch_1 = __importDefault(require("node-fetch"));
44
+ var child_process_1 = require("child_process");
45
+ var kill_port_1 = __importDefault(require("kill-port"));
46
+ var consts_1 = require("./consts");
47
+ var log = require("debug")("@muritavo/testing-toolkit/emulator");
48
+ var spawnResult;
49
+ function WaitTimeout(ml) {
50
+ if (ml === void 0) { ml = 200; }
51
+ return new Promise(function (r) {
52
+ setTimeout(function () {
53
+ r();
54
+ }, ml);
55
+ });
56
+ }
57
+ /**
58
+ * Kills the emulator that was started by this module instance
59
+ *
60
+ * @returns A promise that resolves when the emulator is succesfully killed
61
+ */
62
+ function killEmulator() {
63
+ return __awaiter(this, void 0, void 0, function () {
64
+ return __generator(this, function (_a) {
65
+ if (!spawnResult)
66
+ return [2 /*return*/, Promise.resolve(null)];
67
+ return [2 /*return*/, new Promise(function (r, rej) {
68
+ try {
69
+ var t_1 = setTimeout(function () {
70
+ spawnResult = undefined;
71
+ rej(new Error("Couldn't kill emulator"));
72
+ }, 20000);
73
+ spawnResult.process.on("close", function () {
74
+ clearTimeout(t_1);
75
+ r(null);
76
+ });
77
+ spawnResult.process.kill("SIGINT");
78
+ }
79
+ catch (e) {
80
+ console.log("Unhandled exception", e);
81
+ r(null);
82
+ }
83
+ })];
84
+ });
85
+ });
86
+ }
87
+ exports.killEmulator = killEmulator;
88
+ /**
89
+ * With this you can start an firebase emulator
90
+ * @param args Check property typings for details
91
+ * @returns A promise that resolves when the emulator is ready or fails if the emulator couldn't start or be reached
92
+ */
93
+ function startEmulator(args_1) {
94
+ return __awaiter(this, arguments, void 0, function (args, isRetry) {
95
+ var suiteId;
96
+ var _this = this;
97
+ if (isRetry === void 0) { isRetry = false; }
98
+ return __generator(this, function (_a) {
99
+ switch (_a.label) {
100
+ case 0:
101
+ suiteId = args.suiteId || args.databaseToImport || "default";
102
+ log("Spawning emulator process");
103
+ if (!(suiteId === (spawnResult === null || spawnResult === void 0 ? void 0 : spawnResult.id))) return [3 /*break*/, 1];
104
+ log("Emulator with suite id ".concat(suiteId, " already running"));
105
+ return [2 /*return*/, null];
106
+ case 1: return [4 /*yield*/, killEmulator()];
107
+ case 2:
108
+ _a.sent();
109
+ _a.label = 3;
110
+ case 3:
111
+ spawnResult = {
112
+ id: suiteId,
113
+ project: args.projectId,
114
+ database: args.databaseToImport,
115
+ process: (0, child_process_1.spawn)("firebase emulators:start -P ".concat(args.projectId, " ").concat(args.databaseToImport ? "--import ".concat(args.databaseToImport) : "", " ").concat(args.shouldSaveData ? "--export-on-exit" : "", " ").concat(args.only.length ? "--only=".concat(args.only.join(",")) : ""), {
116
+ cwd: undefined,
117
+ env: process.env,
118
+ shell: true,
119
+ }),
120
+ };
121
+ /**
122
+ * This script exists so we can start an emulator from inside cypress
123
+ */
124
+ return [2 /*return*/, new Promise(function (r, rej) { return __awaiter(_this, void 0, void 0, function () {
125
+ var breakLoop, timeout, scriptOutput, e_1;
126
+ return __generator(this, function (_a) {
127
+ switch (_a.label) {
128
+ case 0:
129
+ breakLoop = false;
130
+ timeout = setTimeout(function () {
131
+ breakLoop = true;
132
+ console.error("Could not receive ok from firebase emulator");
133
+ clearTimeout(timeout);
134
+ rej(new Error("Timeout"));
135
+ spawnResult = undefined;
136
+ }, 30000);
137
+ log("Process is killed: ", spawnResult.process.killed);
138
+ log("Process exit code", spawnResult.process.exitCode);
139
+ spawnResult.process.on("error", function (e) {
140
+ clearTimeout(timeout);
141
+ log("Spawning emulator process failed with error", e.message);
142
+ rej(new Error("Spawning emulator process failed with error ".concat(e.message)));
143
+ spawnResult = undefined;
144
+ });
145
+ spawnResult.process.on("message", function (e) {
146
+ log("Emulator start sent message", e.toString());
147
+ });
148
+ scriptOutput = "";
149
+ spawnResult.process.stdout.on("data", function (data) {
150
+ data = data.toString();
151
+ scriptOutput += data;
152
+ });
153
+ spawnResult.process.on("close", function (e) {
154
+ clearTimeout(timeout);
155
+ log("Emulator closed with", e);
156
+ var unavailablePorts = args.ports.filter(function (p) {
157
+ return scriptOutput.includes(String(p));
158
+ });
159
+ var failedWithUnavailablePort = unavailablePorts.length && e !== 0;
160
+ if (failedWithUnavailablePort) {
161
+ log("Killing ports", unavailablePorts, "detected from text", scriptOutput);
162
+ Promise.all(unavailablePorts.map(function (p) { return (0, kill_port_1.default)(p).catch(function () { }); })).then(function () {
163
+ if (isRetry === false)
164
+ return startEmulator(args, true);
165
+ else
166
+ rej(new Error("Some ports were unavailable (".concat(unavailablePorts.join(", "), "). They were killed, please try running the emulator again")));
167
+ });
168
+ }
169
+ else {
170
+ rej(new Error("Emulator closed with code ".concat(e, ". Check the firebase-debug.log for more details.\nCommand output was:\n").concat(scriptOutput)));
171
+ }
172
+ spawnResult = undefined;
173
+ });
174
+ _a.label = 1;
175
+ case 1:
176
+ if (!!breakLoop) return [3 /*break*/, 7];
177
+ _a.label = 2;
178
+ case 2:
179
+ _a.trys.push([2, 4, , 5]);
180
+ log("Checking if emulator is up");
181
+ return [4 /*yield*/, (0, node_fetch_1.default)("http://".concat(consts_1.LOCALHOST_DOMAIN, ":").concat(args.UIPort))];
182
+ case 3:
183
+ _a.sent();
184
+ log("Emulator is up and ready");
185
+ clearTimeout(timeout);
186
+ breakLoop = true;
187
+ r(null);
188
+ return [3 /*break*/, 5];
189
+ case 4:
190
+ e_1 = _a.sent();
191
+ log(e_1);
192
+ log("Process is killed: ", spawnResult === null || spawnResult === void 0 ? void 0 : spawnResult.process.killed);
193
+ log("Emulator is not ready yet, retrying in 1 sec");
194
+ return [3 /*break*/, 5];
195
+ case 5: return [4 /*yield*/, WaitTimeout(1000)];
196
+ case 6:
197
+ _a.sent();
198
+ return [3 /*break*/, 1];
199
+ case 7: return [2 /*return*/];
200
+ }
201
+ });
202
+ }); })];
203
+ }
204
+ });
205
+ });
206
+ }
207
+ exports.startEmulator = startEmulator;
208
+ function invokeAuthAdmin(_a) {
209
+ return __awaiter(this, arguments, void 0, function (_b) {
210
+ var app, func;
211
+ var projectId = _b.projectId, port = _b.port, functionName = _b.functionName, params = _b.params;
212
+ return __generator(this, function (_c) {
213
+ switch (_c.label) {
214
+ case 0: return [4 /*yield*/, _getAuthAdminInstance(projectId, port)];
215
+ case 1:
216
+ app = _c.sent();
217
+ func = app[functionName];
218
+ return [4 /*yield*/, func.bind(app).apply(void 0, params)];
219
+ case 2:
220
+ _c.sent();
221
+ return [2 /*return*/, null];
222
+ }
223
+ });
224
+ });
225
+ }
226
+ exports.invokeAuthAdmin = invokeAuthAdmin;
227
+ var adminApp = {};
228
+ function _getAuthAdminInstance(projectId, authPort) {
229
+ return __awaiter(this, void 0, void 0, function () {
230
+ var initializeApp, getAuth;
231
+ return __generator(this, function (_a) {
232
+ initializeApp = require("firebase-admin/app").initializeApp;
233
+ getAuth = require("firebase-admin/auth").getAuth;
234
+ process.env.FIREBASE_AUTH_EMULATOR_HOST = "".concat(consts_1.LOCALHOST_DOMAIN, ":").concat(authPort);
235
+ adminApp[projectId] =
236
+ adminApp[projectId] || initializeApp({ projectId: projectId }, projectId);
237
+ return [2 /*return*/, getAuth(adminApp[projectId])];
238
+ });
239
+ });
240
+ }
241
+ //# sourceMappingURL=emulator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emulator.js","sourceRoot":"","sources":["../../../src/native/emulator.ts"],"names":[],"mappings":"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"}