UNPKG

expo-font-weights

Version:

Load fonts at runtime and use them in React Native components.

78 lines (77 loc) 3.95 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.withFontsAndroid = void 0; const codeMod_1 = require("@expo/config-plugins/build/android/codeMod"); const config_plugins_1 = require("expo/config-plugins"); const promises_1 = __importDefault(require("fs/promises")); const path_1 = __importDefault(require("path")); const utils_1 = require("./utils"); const withFontsAndroid = (config, fonts) => { config = addFontsInDir(config, fonts); config = appendCustomFontCodeToMainApp(config, fonts); return config; }; exports.withFontsAndroid = withFontsAndroid; function appendCustomFontCodeToMainApp(config, fonts) { const fontObjects = fonts.filter((f) => typeof f !== 'string'); const fontsByFamily = (0, utils_1.groupBy)(fontObjects, 'family'); config = addFontXmlToMainApplication(config, Object.keys(fontsByFamily)); return (0, config_plugins_1.withDangerousMod)(config, [ 'android', async (config) => { const fontsDir = path_1.default.join(config.modRequest.platformProjectRoot, 'app/src/main/res/font'); await Promise.all(Object.values(fontsByFamily).map((fonts) => { return config_plugins_1.XML.writeXMLAsync({ path: path_1.default.join(fontsDir, `${(0, utils_1.toAndroidResourceString)(fonts[0].family)}.xml`), xml: { 'font-family': { $: { 'xmlns:app': 'http://schemas.android.com/apk/res-auto', }, font: fonts.map((font) => ({ $: { 'app:fontStyle': font.style || 'normal', 'app:fontWeight': font.weight, 'app:font': `@font/${path_1.default.parse(font.path).name}`, }, })), }, }, }); })); return config; }, ]); } function fontManagerCode(family) { return `ReactFontManager.getInstance().addCustomFont(this, "${family}", R.font.${(0, utils_1.toAndroidResourceString)(family)});`; } function addFontXmlToMainApplication(config, families) { return (0, config_plugins_1.withMainApplication)(config, async (config) => { config.modResults.contents = (0, codeMod_1.addImports)(config.modResults.contents, ['com.facebook.react.common.assets.ReactFontManager'], config.modResults.language === 'java'); config.modResults.contents = (0, codeMod_1.appendContentsInsideDeclarationBlock)(config.modResults.contents, 'onCreate', families.map(fontManagerCode).join('\n')); return config; }); } function addFontsInDir(config, fonts) { return (0, config_plugins_1.withDangerousMod)(config, [ 'android', async (config) => { const paths = fonts.map((font) => (typeof font === 'string' ? font : font.path)); const resolvedFonts = await (0, utils_1.resolveFontPaths)(paths, config.modRequest.projectRoot); await Promise.all(resolvedFonts.map(async (asset) => { const fontsDir = path_1.default.join(config.modRequest.platformProjectRoot, 'app/src/main/res/font'); await promises_1.default.mkdir(fontsDir, { recursive: true }); const output = path_1.default.join(fontsDir, path_1.default.basename(asset)); if (output.endsWith('.ttf') || output.endsWith('.otf')) { await promises_1.default.copyFile(asset, output); } })); return config; }, ]); } // import com.facebook.react.common.assets.ReactFontManager