@nxextensions/firebase-cypress
Version:
An NX Plugin for Firebase Applications that would like to use emulators for E2E testing with Cypress
87 lines • 3.49 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.detectFirebase = detectFirebase;
exports.startFirebaseEmulators = startFirebaseEmulators;
exports.terminateEmulatorsIfStarted = terminateEmulatorsIfStarted;
const tslib_1 = require("tslib");
const devkit_1 = require("@nx/devkit");
const fs_1 = require("fs");
const path_1 = require("path");
const target_string_to_target_1 = require("./target-string-to-target");
// @ts-expect-error This is the only way to import this
const killPort = tslib_1.__importStar(require("kill-port"));
const run_cypress_1 = tslib_1.__importDefault(require("./run-cypress"));
function detectFirebase(context) {
const dependency = getE2EProjectDependency(context);
const siblingFiles = (0, fs_1.readdirSync)((0, path_1.join)(context.root, dependency.root));
if (!siblingFiles.includes('firebase.json')) {
return { isPresent: false };
}
const { hasEmulators } = getPortForFirebaseEmulator((0, path_1.join)(context.root, dependency.root, 'firebase.json'));
return hasEmulators
? { isPresent: true }
: { isPresent: false };
}
function getPortForFirebaseEmulator(firebaseJsonPath) {
const firebaseConfig = (0, devkit_1.readJsonFile)(firebaseJsonPath);
if (!(firebaseConfig === null || firebaseConfig === void 0 ? void 0 : firebaseConfig.emulators)) {
return { hasEmulators: false };
}
let port;
Object.keys(firebaseConfig.emulators).forEach((key) => {
var _a;
if (!port) {
port = (_a = firebaseConfig.emulators[key]) === null || _a === void 0 ? void 0 : _a.port;
}
});
if (!port) {
return { hasEmulators: false };
}
return { hasEmulators: true };
}
async function* startFirebaseEmulators(watch, command, options, context) {
const target = (0, target_string_to_target_1.targetStringToTarget)(command);
for await (const _s of await (0, devkit_1.runExecutor)(target, {}, context)) {
if (!_s.success) {
yield { success: false };
break;
}
const result = await (0, run_cypress_1.default)(options, context);
yield result;
if (!watch) {
break;
}
}
}
async function terminateEmulatorsIfStarted(context) {
const dependency = getE2EProjectDependency(context);
const portsArray = getPortsForEmulators((0, path_1.join)(context.root, dependency.root, 'firebase.json'));
try {
for (const port of portsArray) {
await killPort(+port);
}
}
catch (e) {
console.error(e);
}
}
function getE2EProjectDependency(context) {
const projectName = context.projectName;
const projects = (0, devkit_1.readProjectsConfigurationFromProjectGraph)(context.projectGraph);
const dependencyName = projects.projects[projectName].implicitDependencies[0];
return projects.projects[dependencyName];
}
function getPortsForEmulators(firebaseJsonPath) {
const firebaseConfig = (0, devkit_1.readJsonFile)(firebaseJsonPath);
if (!(firebaseConfig === null || firebaseConfig === void 0 ? void 0 : firebaseConfig.emulators)) {
return [];
}
const res = [];
Object.keys(firebaseConfig.emulators).forEach((key) => {
if (!!firebaseConfig.emulators[key].port && !res.includes(firebaseConfig.emulators[key].port)) {
res.push(firebaseConfig.emulators[key].port);
}
});
return res;
}
//# sourceMappingURL=firebase.js.map