@rnx-kit/tools-react-native
Version:
A collection of supplemental react-native functions and types
198 lines • 7.26 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.getAvailablePlatforms = void 0;
exports.expandPlatformExtensions = expandPlatformExtensions;
exports.getModuleSuffixes = getModuleSuffixes;
exports.getAvailablePlatformsUncached = getAvailablePlatformsUncached;
exports.platformExtensions = platformExtensions;
exports.tryParsePlatform = tryParsePlatform;
exports.parsePlatform = parsePlatform;
exports.platformValues = platformValues;
const package_1 = require("@rnx-kit/tools-node/package");
const fs = __importStar(require("node:fs"));
const path = __importStar(require("node:path"));
const context_1 = require("./context");
// Possible values for AllPlatforms
const allValues = [
"android",
"ios",
"macos",
"win32",
"windows",
"visionos",
];
/**
* Returns a list of extensions that should be tried for the target platform in
* prioritized order.
* @param platform The platform to expand platform extensions for
* @param extensions A list of extensions to expand
* @returns A list of extensions
*/
function expandPlatformExtensions(platform, extensions) {
const platforms = platformExtensions(platform);
const expanded = platforms.reduce((expanded, platform) => {
expanded.push(...extensions.map((ext) => `.${platform}${ext}`));
return expanded;
}, []);
expanded.push(...extensions);
return expanded;
}
/**
* Get the module suffixes array for a given platform, suitable for use with TypeScript's moduleSuffixes setting
* in the form of ['.ios', '.native', ''] or ['.windows', '.win', '.native', ''] or similar
*
* @param platform platform to get module suffixes for
* @param appendEmpty finish the suffixes with an empty entry, required for typescript usage
* @returns an array of suffixes to try to match a module to in order of priority
*/
function getModuleSuffixes(platform, appendEmpty = true) {
const extensions = platformExtensions(platform).map((ext) => `.${ext}`);
if (appendEmpty) {
extensions.push("");
}
return extensions;
}
/**
* Returns a map of available React Native platforms. The result is NOT cached.
* @param startDir The directory to look for react-native platforms from
* @param platformMap A platform-to-npm-package map of known packages
* @returns A platform-to-npm-package map, excluding "core" platforms.
*/
function getAvailablePlatformsUncached(startDir = process.cwd(), platformMap = { android: "", ios: "" }) {
const packageJson = path.join(startDir, "package.json");
if (!fs.existsSync(packageJson)) {
const parent = path.dirname(startDir);
return parent === startDir
? platformMap
: getAvailablePlatformsUncached(path.dirname(startDir), platformMap);
}
const { dependencies, peerDependencies, devDependencies } = JSON.parse(fs.readFileSync(packageJson, { encoding: "utf-8" }));
const packages = new Set(dependencies ? Object.keys(dependencies) : []);
for (const deps of [peerDependencies, devDependencies]) {
if (deps) {
for (const pkg of Object.keys(deps)) {
packages.add(pkg);
}
}
}
const recordPlatformPackage = (pkgPath) => {
if (!pkgPath) {
return;
}
const manifest = (0, context_1.readReactNativeConfig)(pkgPath, startDir);
if (!manifest) {
return;
}
const { platforms } = manifest;
if (!platforms || typeof platforms !== "object") {
return;
}
for (const [platform, info] of Object.entries(platforms)) {
if (typeof platformMap[platform] === "undefined") {
const { npmPackageName } = info;
if (npmPackageName) {
platformMap[platform] = npmPackageName;
}
}
}
};
recordPlatformPackage(startDir);
const options = { startDir };
packages.forEach((pkgName) => {
const pkgPath = (0, package_1.findPackageDependencyDir)(pkgName, options);
if (pkgPath) {
recordPlatformPackage(pkgPath);
}
});
return platformMap;
}
/**
* Returns a map of available React Native platforms. The result is cached.
* @param startDir The directory to look for react-native platforms from
* @returns A platform-to-npm-package map, excluding "core" platforms.
*/
exports.getAvailablePlatforms = (() => {
const isTesting = Boolean(process.env.NODE_TEST_CONTEXT) || process.env.NODE_ENV === "test";
let platformMap = undefined;
return (startDir = process.cwd()) => {
if (!platformMap || isTesting) {
platformMap = getAvailablePlatformsUncached(startDir);
}
return platformMap;
};
})();
/**
* Returns file extensions that can be mapped to the target platform.
* @param platform The platform to retrieve extensions for
* @returns Valid extensions for specified platform
*/
function platformExtensions(platform) {
switch (platform) {
case "win32":
case "windows":
return [platform, "win", "native"];
default:
return [platform, "native"];
}
}
/**
* @returns the given string as a platform value or undefined if it is not a valid platform.
*/
function tryParsePlatform(val) {
return allValues.includes(val)
? val
: undefined;
}
/**
* Parse a string to ensure it maps to a valid react-native platform.
*
* @param val Input string
* @returns React-native platform name. Throws `Error` on failure.
*/
function parsePlatform(val) {
const platform = tryParsePlatform(val);
if (!platform) {
throw new Error(`Unknown platform '${val}'`);
}
return platform;
}
/**
* @returns List of all supported react-native platforms.
*/
function platformValues() {
return allValues;
}
//# sourceMappingURL=platform.js.map