react-native-integrate
Version:
Automate integration of additional code into React Native projects
134 lines (133 loc) • 4.2 kB
JavaScript
;
// noinspection JSUnusedGlobalSymbols
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.mockFs = void 0;
const constants_1 = require("../../constants");
const escapeRegExp_1 = require("../../utils/escapeRegExp");
const path_1 = __importDefault(require("path"));
let store = {};
const permissions = {
read: true,
write: true,
};
function isDirectoryMatch(path, directory) {
return new RegExp((0, escapeRegExp_1.escapeRegExp)(directory) + `(?:${(0, escapeRegExp_1.escapeRegExp)(path_1.default.sep)}|$)`, 'i').test(path);
}
exports.mockFs = {
existsSync: jest.fn((path) => {
path = path_1.default.resolve(path);
return Object.keys(store).some(key => isDirectoryMatch(key, path));
}),
renameSync: (from, to) => {
from = path_1.default.resolve(from);
to = path_1.default.resolve(to);
Object.entries(store)
.filter(([key]) => isDirectoryMatch(key, from))
.forEach(([key, value]) => {
store[key.replace(from, to)] = value;
delete store[key];
});
},
readFileSync: (path) => {
path = path_1.default.resolve(path);
if (!permissions.read)
throw new Error('[mock] permission denied');
if (!(path in store))
throw new Error('[mock] file not found');
return store[path];
},
writeFileSync: (path, data) => {
path = path_1.default.resolve(path);
if (!permissions.write)
throw new Error('[mock] permission denied');
store[path] = data;
return true;
},
copyFileSync: (from, to) => {
from = path_1.default.resolve(from);
to = path_1.default.resolve(to);
const content = exports.mockFs.readFileSync(from);
exports.mockFs.writeFileSync(to, content);
return true;
},
copyFile: jest.fn((from, to, cb) => {
from = path_1.default.resolve(from);
to = path_1.default.resolve(to);
exports.mockFs.copyFileSync(from, to);
cb();
}),
mkdirSync: () => {
return true;
},
rmSync: (path) => {
path = path_1.default.resolve(path);
Object.keys(store)
.filter(key => isDirectoryMatch(key, path))
.forEach(key => delete store[key]);
return true;
},
rm: jest.fn((path, _opts, cb) => {
exports.mockFs.rmSync(path);
cb();
}),
mkdir: jest.fn((_path, _opts, cb) => cb()),
readdirSync: () => {
return ['test' + constants_1.Constants.XCODEPROJ_EXT];
},
readdir: jest.fn(),
unlink: jest.fn((filePath, cb) => {
filePath = path_1.default.resolve(filePath);
delete store[filePath];
cb();
}),
lstatSync: jest.fn((p) => {
p = path_1.default.resolve(p);
if (Object.keys(store).includes(p)) {
return {
isFile: () => true,
isDirectory: () => false,
};
}
else if (Object.keys(store).some(key => isDirectoryMatch(key, p))) {
return {
isFile: () => false,
isDirectory: () => true,
};
}
else {
throw new Error('[mock] file not found');
}
}),
watch: (_filePath,
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
_opts, listener) => {
if (!permissions.read)
throw new Error('[mock] permission denied');
// simulate created
setImmediate(() => listener('rename', 'file.json'));
return {
close: jest.fn(),
};
},
reset() {
store = {};
permissions.read = true;
permissions.write = true;
},
getStore() {
return store;
},
setReadPermission(value) {
permissions.read = value;
},
setWritePermission(value) {
permissions.write = value;
},
get permissions() {
return permissions;
},
};
jest.mock('fs', () => exports.mockFs);