in scripts/compilation/Inliner.js [67:147]
async discoverVariants() {
if (this.bailout) {
console.log("Inliner bailout.");
return this;
}
this.variantEntries = Object.entries(this.pkgJson["react-native"] ?? {});
for await (const file of walk(path.join(this.packageDirectory, "dist-cjs"))) {
if (file.endsWith(".js") && fs.existsSync(file.replace(/\.js$/, ".native.js"))) {
console.log("detected undeclared auto-variant", file);
const canonical = file.replace(/(.*?)dist-cjs\//, "./dist-cjs/").replace(/\.js$/, "");
const variant = canonical.replace(/(.*?)(\.js)?$/, "$1.native$2");
this.variantEntries.push([canonical, variant]);
}
if (fs.existsSync(file.replace(/\.js$/, ".browser.js"))) {
// not applicable to CJS?
}
}
this.transitiveVariants = [];
for (const [k, v] of this.variantEntries) {
for (const variantFile of [k, String(v)]) {
if (!variantFile.includes("dist-cjs/")) {
continue;
}
const keyFile = path.join(
this.packageDirectory,
"dist-cjs",
variantFile.replace(/(.*?)dist-cjs\//, "") + (variantFile.endsWith(".js") ? "" : ".js")
);
const keyFileContents = fs.readFileSync(keyFile, "utf-8");
const requireStatements = keyFileContents.matchAll(/require\("(.*?)"\)/g);
for (const requireStatement of requireStatements) {
if (requireStatement[1]?.startsWith(".")) {
// is relative import.
const key = path
.normalize(path.join(path.dirname(keyFile), requireStatement[1]))
.replace(/(.*?)dist-cjs\//, "./dist-cjs/");
if (this.verbose) {
console.log("Transitive variant file:", key);
}
const transitiveVariant = key.replace(/(.*?)dist-cjs\//, "").replace(/(\.js)?$/, "");
if (!this.transitiveVariants.includes(transitiveVariant)) {
this.variantEntries.push([key, key]);
this.transitiveVariants.push(transitiveVariant);
}
}
}
}
}
this.variantExternals = [];
this.variantMap = {};
for (const [k, v] of this.variantEntries) {
const prefix = "dist-cjs/";
const keyPrefixIndex = k.indexOf(prefix);
if (keyPrefixIndex === -1) {
continue;
}
const keyRelativePath = k.slice(keyPrefixIndex + prefix.length);
const valuePrefixIndex = String(v).indexOf(prefix);
const addJsExtension = (file) => (file.endsWith(".js") ? file : file + ".js");
if (valuePrefixIndex !== -1) {
const valueRelativePath = String(v).slice(valuePrefixIndex + prefix.length);
this.variantExternals.push(...[keyRelativePath, valueRelativePath].map(addJsExtension));
this.variantMap[keyRelativePath] = valueRelativePath;
} else {
this.variantExternals.push(addJsExtension(keyRelativePath));
this.variantMap[keyRelativePath] = v;
}
}
return this;
}