@expo/cli
Version:
283 lines (282 loc) • 10.4 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
resolveBuildCache: function() {
return resolveBuildCache;
},
resolveBuildCacheProvider: function() {
return resolveBuildCacheProvider;
},
resolvePluginFunction: function() {
return resolvePluginFunction;
},
uploadBuildCache: function() {
return uploadBuildCache;
}
});
function _fs() {
const data = /*#__PURE__*/ _interop_require_default(require("fs"));
_fs = function() {
return data;
};
return data;
}
function _path() {
const data = /*#__PURE__*/ _interop_require_default(require("path"));
_path = function() {
return data;
};
return data;
}
function _resolvefrom() {
const data = /*#__PURE__*/ _interop_require_default(require("resolve-from"));
_resolvefrom = function() {
return data;
};
return data;
}
const _helpers = require("./helpers");
const _log = /*#__PURE__*/ _interop_require_wildcard(require("../../log"));
const _ensureDependenciesAsync = require("../../start/doctor/dependencies/ensureDependenciesAsync");
const _errors = require("../errors");
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interop_require_wildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {
__proto__: null
};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
const debug = require('debug')('expo:run:build-cache-provider');
const resolveBuildCacheProvider = async (provider, projectRoot)=>{
if (!provider) {
return;
}
if (provider === 'eas') {
try {
await (0, _ensureDependenciesAsync.ensureDependenciesAsync)(projectRoot, {
isProjectMutable: true,
installMessage: 'eas-build-cache-provider package is required to use the EAS build cache.\n',
warningMessage: 'Unable to to use the EAS remote build cache.',
requiredPackages: [
{
pkg: 'eas-build-cache-provider',
file: 'eas-build-cache-provider/package.json',
dev: true
}
]
});
// We need to manually load dependencies installed on the fly
const plugin = await manuallyLoadDependency(projectRoot, 'eas-build-cache-provider');
return {
plugin: plugin.default ?? plugin,
options: {}
};
} catch (error) {
if (error instanceof _errors.CommandError) {
_log.warn(error.message);
} else {
throw error;
}
return undefined;
}
}
if (typeof provider === 'object' && typeof provider.plugin === 'string') {
const plugin = resolvePluginFunction(projectRoot, provider.plugin);
return {
plugin,
options: provider.options
};
}
throw new Error('Invalid build cache provider');
};
async function resolveBuildCache({ projectRoot, platform, provider, runOptions }) {
const fingerprintHash = await calculateFingerprintHashAsync({
projectRoot,
platform,
provider,
runOptions
});
if (!fingerprintHash) {
return null;
}
if ('resolveRemoteBuildCache' in provider.plugin) {
_log.warn('The resolveRemoteBuildCache function is deprecated. Use resolveBuildCache instead.');
return await provider.plugin.resolveRemoteBuildCache({
fingerprintHash,
platform,
runOptions,
projectRoot
}, provider.options);
}
return await provider.plugin.resolveBuildCache({
fingerprintHash,
platform,
runOptions,
projectRoot
}, provider.options);
}
async function uploadBuildCache({ projectRoot, platform, provider, buildPath, runOptions }) {
const fingerprintHash = await calculateFingerprintHashAsync({
projectRoot,
platform,
provider,
runOptions
});
if (!fingerprintHash) {
debug('No fingerprint hash found, skipping upload');
return;
}
if ('uploadRemoteBuildCache' in provider.plugin) {
_log.warn('The uploadRemoteBuildCache function is deprecated. Use uploadBuildCache instead.');
await provider.plugin.uploadRemoteBuildCache({
projectRoot,
platform,
fingerprintHash,
buildPath,
runOptions
}, provider.options);
} else {
await provider.plugin.uploadBuildCache({
projectRoot,
platform,
fingerprintHash,
buildPath,
runOptions
}, provider.options);
}
}
async function calculateFingerprintHashAsync({ projectRoot, platform, provider, runOptions }) {
if (provider.plugin.calculateFingerprintHash) {
return await provider.plugin.calculateFingerprintHash({
projectRoot,
platform,
runOptions
}, provider.options);
}
const Fingerprint = importFingerprintForDev(projectRoot);
if (!Fingerprint) {
debug('@expo/fingerprint is not installed in the project, unable to calculate fingerprint');
return null;
}
const fingerprint = await Fingerprint.createFingerprintAsync(projectRoot);
return fingerprint.hash;
}
function importFingerprintForDev(projectRoot) {
try {
return require(require.resolve('@expo/fingerprint', {
paths: [
projectRoot
]
}));
} catch (error) {
if ('code' in error && error.code === 'MODULE_NOT_FOUND') {
return null;
}
throw error;
}
}
/**
* Resolve the provider plugin from a node module or package.
* If the module or package does not include a provider plugin, this function throws.
* The resolution is done in following order:
* 1. Is the reference a relative file path or an import specifier with file path? e.g. `./file.js`, `pkg/file.js` or `@org/pkg/file.js`?
* - Resolve the provider plugin as-is
* 2. Does the module have a valid provider plugin in the `main` field?
* - Resolve the `main` entry point as provider plugin
*/ function resolvePluginFilePathForModule(projectRoot, pluginReference) {
if ((0, _helpers.moduleNameIsDirectFileReference)(pluginReference)) {
// Only resolve `./file.js`, `package/file.js`, `@org/package/file.js`
const pluginScriptFile = _resolvefrom().default.silent(projectRoot, pluginReference);
if (pluginScriptFile) {
return pluginScriptFile;
}
} else if ((0, _helpers.moduleNameIsPackageReference)(pluginReference)) {
// Try to resole the `main` entry as config plugin
return (0, _resolvefrom().default)(projectRoot, pluginReference);
}
throw new Error(`Failed to resolve provider plugin for module "${pluginReference}" relative to "${projectRoot}". Do you have node modules installed?`);
}
function resolvePluginFunction(projectRoot, pluginReference) {
const pluginFile = resolvePluginFilePathForModule(projectRoot, pluginReference);
try {
let plugin = require(pluginFile);
if ((plugin == null ? void 0 : plugin.default) != null) {
plugin = plugin.default;
}
if (typeof plugin !== 'object' || typeof plugin.resolveRemoteBuildCache !== 'function' && typeof plugin.resolveBuildCache !== 'function' || typeof plugin.uploadRemoteBuildCache !== 'function' && typeof plugin.uploadBuildCache !== 'function') {
throw new Error(`
The provider plugin "${pluginReference}" must export an object containing
the resolveBuildCache and uploadBuildCache functions.
`);
}
return plugin;
} catch (error) {
if (error instanceof SyntaxError) {
// Add error linking to the docs of how create a valid provider plugin
}
throw error;
}
}
async function manuallyLoadDependency(projectRoot, packageName) {
const possiblePaths = [
_path().default.join(projectRoot, 'node_modules'),
...require.resolve.paths(packageName) ?? []
];
const nodeModulesFolder = possiblePaths == null ? void 0 : possiblePaths.find((p)=>{
const packagePath = _path().default.join(p, packageName);
return _fs().default.existsSync(packagePath);
});
if (!nodeModulesFolder) {
throw new Error(`Package ${packageName} not found in ${possiblePaths}`);
}
const { main } = await Promise.resolve(_path().default.join(nodeModulesFolder, packageName, 'package.json')).then((p)=>/*#__PURE__*/ _interop_require_wildcard(require(p)));
return Promise.resolve(_path().default.join(nodeModulesFolder, packageName, main)).then((p)=>/*#__PURE__*/ _interop_require_wildcard(require(p)));
}
//# sourceMappingURL=index.js.map
;